2013-04-29 103 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)