2013-04-29 68 views
0

如何从字典中获取键/值对,并在类中的实例中使用属性?我确定它应该通过for循环,但我不确定使用什么语法。这里是我的代码:作业:Python 3.3:将字典中的键和值添加到类

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循环会更容易吗?有没有办法将驾驶员姓名和赞助商添加为属性,同时使用里程表和速度的默认值?

+2

作为一个侧面说明,你真的应该与你的大写一致。理想情况下遵循[PEP 8](http://www.python.org/dev/peps/pep-0008/)style:'Car','drivers','self.driver'等。但即使您选择使用不同的风格,使用你一贯选择的任何东西。 – abarnert 2013-04-29 20:50:49

回答

2

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

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

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

是有办法在驱动程序名称添加和赞助商的属性,而使用的里程表和转速的默认值?

是的。事实上,你已经做到了。你定义car.__init__的样子,你只是离开了其他两个参数,他们会得到默认值:

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

所以,现在所有你缺少的是创建20个car实例的方式出于你的drivers字典。

假设你想有一个dict该驱动程序名称映射到car情况下,使用字典理解:

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

或者,如果你只是想carlist一个实例,使用列表理解来代替:

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

另一件事:您定义的方式car.__init__,您使用的是单个随机数r代表每一辆汽车的速度:

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')) 

max功能,最喜欢的分拣并在Python中搜索函数,需要一个可选的key,这是一个函数,告诉它要分类或搜索什么。 attrgetter(name)是一个函数调用,它返回一个函数,该函数为任何对象获取名为name的属性。有关详细信息,请参阅Sorting Mini-HOW TO

为了比较,让我们写的那部分明确:

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

如果我理解正确,使用词典理解将将驱动程序列表映射到汽车类中的驱动程序和赞助商属性,并将使用驱动程序名称作为自我,这是否正确?所以我应该可以打电话给像David.car这样的汽车物体,或者用David.Odometer检查里程表?至于操纵数据,字典理解对列表理解有什么优势?感谢您花时间和精力来帮助教育。非常感谢! – 2013-04-29 21:43:52

+0

@JustinDay:使用dict理解将每个驱动程序(像“David”这样的字符串)映射到一个car对象(它具有'Driver'和'Sponsor'属性,以及'Odomoter'和'Speed'属性)。你没有得到名为'David'的汽车实例,但你得到一个名为'cars [“David”]的汽车实例。 – abarnert 2013-04-29 21:49:39

+0

@JustinDay:在列表中使用字典的好处是你有这个映射。否则,你只会得到一个名为'cars [0]'的汽车实例。如果你不需要知道哪辆车是大卫的,哪辆车是特拉维斯的,等等,你需要的是你可以循环的所有车辆的列表,然后列表更好。如果你需要知道哪辆车是大卫的话,那么字典会更好。 – abarnert 2013-04-29 21:51:43

3

您可以使用:

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

这就是所谓的名单理解,并创建汽车对象的列表,每个使用的驱动程序,并从字典中相应的保荐人(但里程表和转速的默认值)。

1

你有几个问题在这里:

  • Speed指的是局部变量。在car.update,Speed未定义。 self.Speed是你在找什么。
  • def __init__(self, ..., Speed=randint(1,121)):将给所有的驱动程序相同的随机起始速度。
  • car.update需要通过self的说法。

以下是我想做到这一点:更简洁

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

为:

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) 

你可以写这部分

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