[英]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()}
或者,如果你只是想要一個list
的car
的情況下,使用列表理解來代替:
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.