繁体   English   中英

作业:Python 3.3:将字典中的键和值添加到类中

[英]Assignment: Python 3.3: add keys and values from dictionary to class

如何从字典中获取键/值对,并在类的实例中用作属性? 我确定它应该经过for循环,但是我不确定要使用哪种语法。 这是我的代码:

from random import randint
import time
drivers={}

class car:
    def __init__(self, Driver, Sponsor, Odometer=0,Speed=randint(1,121)):
        self.Driver = Driver
        self.Sponsor = Sponsor
        self.Odometer = Odometer
        self.Speed = Speed
    def update():
        Odometer=Odometer+Speed*0.17
        Speed = randint(1,121)
drivers['David']='Burger King'
drivers['Travis']='Dr Pepper'
drivers['Landon']='Precon Marine'
drivers['Jamie']='Cessna'
drivers['Juan']='Target'
drivers['Ken']='Federated Auto Parts'
drivers['Timmy']='OXYwater'
drivers['Josh']='MDS Transport'
drivers['Kurt']='Furniture Row'
drivers['Casey']='Geico'
drivers['Kasey']='Farmers Insurance'
drivers['Jeff']='Axalta'
drivers['Jimmie']='Lowes'
drivers['Dale']='National Guard'
drivers['Mike']='Plinker Tactical'
drivers['Denny']='FedEx'
drivers['Kyle']='Mars Brands'
drivers['Matt']='Husky'
drivers['Bobby']='Kingsford'
drivers['Clint']='5-Hour Energy'

我意识到驱动程序字典很长(可能会有一种更简单的方法来添加所有这些驱动程序)。 我需要在列表(或字典,在这种情况下)中添加20个驱动程序及其赞助商。 将它们简单地添加到类中,而不是使用for循环会更容易吗? 在使用里程表和速度的默认值时,是否可以添加驱动程序名称和赞助者作为属性?

您可以使用:

cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]

这称为列表理解,它创建汽车对象的列表,每个对象都使用驾驶员和字典中的相应赞助商(但里程表和速度的默认值)。

我意识到驱动程序字典很长(可能会有一种更简单的方法来添加所有这些驱动程序)。

是的,您可以使用字典显示:

drivers = {
    'David': 'Burger King',
    'Travis': 'Dr Pepper',
    # ...
}

有没有办法使用里程表和速度的默认值添加驱动程序名称和赞助者作为属性?

是。 实际上,您已经做到了。 定义car.__init__ ,您只需省略其他两个参数,它们将获得默认值:

>>> david = car('David', 'Burger King')
>>> david.Driver
'David'
>>> david.Odometer
0

因此,现在您所缺少的只是一种根据drivers命令创建20个car实例的方法。

假设你想要一个dict映射驱动器名称car的情况下,使用字典理解:

cars = {driver: car(driver, sponsor) for driver, sponsor in drivers.items()}

或者,如果你只是想要一个listcar的情况下,使用列表理解来代替:

cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]

另一件事:您定义car.__init__ ,是针对每个汽车的速度使用一个随机数:

def __init__(self, Driver, Sponsor, Odometer=0,Speed=randint(1,121)):

当Python评估此函数定义时,它将调用randint(1,121)并将结果作为每次调用该函数的默认值。

您想要的可能是这样的:

def __init__(self, Driver, Sponsor, Odometer=0, Speed=None):
    if speed is None:
        speed = randint(1,121)

最后,您的update方法需要使用一个self参数,并且需要使用该参数来访问或修改对象的属性,就像__init__方法一样:

def update(self):
    self.Odometer = self.Odometer + self.Speed*0.17
    self.Speed = randint(1,121)

从评论中看来,您要做的唯一一件事是反复遍历所有汽车,然后在末尾搜索获胜者。 为此,您不需要汽车的字典,只需列表。 所以:

cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]

现在,这是您每分钟要做的事情:

for car in cars:
    car.update()

最后,赢家是:

winner = max(cars, key=operator.attrgetter('Odometer'))

像Python中的大多数排序和搜索功能一样, max函数采用一个可选的key ,它是一个告诉其排序或搜索内容的函数。 attrgetter(name)是一个函数调用,它返回一个函数,该函数获取任何对象的名为name的属性。 有关详细信息,请参见“ 排序方式”

为了进行比较,让我们显式地编写该部分:

winner = None
for car in cars:
    if winner is None or car.Odometer > winner.Odometer:
        winner = car

您在这里遇到一些问题:

  • Speed是指局部变量。 car.update ,未定义Speed self.Speed是您想要的。
  • def __init__(self, ..., Speed=randint(1,121)):将为所有驾驶员提供相同的随机起始速度。
  • car.update需要传递一个self变量。

这是我的处理方式:

import random
import time

drivers = {
    'David': 'Burger King',
    'Travis': 'Dr Pepper',
    'Landon': 'Precon Marine',
    'Jamie': 'Cessna',
    'Juan': 'Target',
    'Ken': 'Federated Auto Parts',
    'Timmy': 'OXYwater',
    'Josh': 'MDS Transport',
    'Kurt': 'Furniture Row',
    'Casey': 'Geico',
    'Kasey': 'Farmers Insurance',
    'Jeff': 'Axalta',
    'Jimmie': 'Lowes',
    'Dale': 'National Guard',
    'Mike': 'Plinker Tactical',
    'Denny': 'FedEx',
    'Kyle': 'Mars Brands',
    'Matt': 'Husky',
    'Bobby': 'Kingsford',
    'Clint': '5-Hour Energy'
}

class Car(object):
    def __init__(self, driver, sponsor, odometer=0, speed=None):
        self.driver = driver
        self.sponsor = sponsor
        self.odometer = odometer

        if speed is None:
            self.speed = random.randint(1, 121)
        else:
            self.speed = speed

    def update(self):
        self.odometer += self.speed * 0.17
        self.speed = random.randint(1, 121)

if __name__ == '__main__':
    cars = []

    for driver, sponsor in drivers.items():
        car = Car(driver, sponsor)
        cars.append(car)

您可以编写以下部分:

    if speed is None:
        self.speed = random.randint(1, 121)
    else:
        self.speed = speed

简而言之:

    self.speed = speed or random.randint(1, 121)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM