赋值:Python3.3:将字典中的键和值添加到类中
如何从字典中获取键/值对,并将其用作类实例中的属性?我确信它应该经过for循环,但我不确定使用什么语法。这是我的密码:赋值:Python3.3:将字典中的键和值添加到类中,python,class,dictionary,python-3.3,Python,Class,Dictionary,Python 3.3,如何从字典中获取键/值对,并将其用作类实例中的属性?我确信它应该经过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 = Sp
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()]
这称为列表理解,它创建一个汽车对象列表,每个对象使用字典中的驾驶员和相应的赞助者(但里程表和速度的默认值)。您可以使用:
cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]
这称为列表理解,它创建了一个汽车对象列表,每个对象都使用字典中的一个驾驶员和相应的赞助者(但是里程表和速度的默认值)
我意识到驱动程序字典很长(可能有一种更简单的方法来添加所有这些驱动程序)
是的,您可以使用dict显示器:
drivers = {
'David': 'Burger King',
'Travis': 'Dr Pepper',
# ...
}
在使用里程表和车速的默认值时,是否有方法将驾驶员姓名和赞助商添加为属性
对。事实上,你已经做到了。按照您定义car.\uuuu init\uuuu
的方式,您只需省略其他两个参数,它们将获得默认值:
>>> david = car('David', 'Burger King')
>>> david.Driver
'David'
>>> david.Odometer
0
因此,现在您所缺少的是一种从drivers
dict中创建20个car
实例的方法
假设您需要一个将驾驶员姓名映射到car
实例的dict
,请使用dict理解:
cars = {driver: car(driver, sponsor) for driver, sponsor in drivers.items()}
或者,如果您只需要汽车实例的列表
,请改用列表:
cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]
另一件事:按照您定义汽车的方式。\uuu init\uu
,您对每辆汽车的速度都使用一个随机数:
def __init__(self, Driver, Sponsor, Odometer=0,Speed=randint(1,121)):
当Python计算此函数定义时,它将调用randint(1121)
,并将结果作为每次调用函数的默认值
你想要的可能是这样的:
def __init__(self, Driver, Sponsor, Odometer=0, Speed=None):
if speed is None:
speed = randint(1,121)
最后,您的update
方法需要采用self
参数,并且需要使用该参数来访问或修改对象的属性,就像您的\uuuuu init\uuu
方法一样:
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
函数使用可选的键
,该函数告诉它排序或搜索的依据。而attrgetter(name)
是一个函数调用,它返回一个函数,该函数为任何对象获取名为name
的属性。有关详细信息,请参阅
为了进行比较,让我们明确地写下这一部分:
winner = None
for car in cars:
if winner is None or car.Odometer > winner.Odometer:
winner = car
我意识到驱动程序字典很长(可能有一种更简单的方法来添加所有这些驱动程序)
是的,您可以使用dict显示器:
drivers = {
'David': 'Burger King',
'Travis': 'Dr Pepper',
# ...
}
在使用里程表和车速的默认值时,是否有方法将驾驶员姓名和赞助商添加为属性
对。事实上,你已经做到了。按照您定义car.\uuuu init\uuuu
的方式,您只需省略其他两个参数,它们将获得默认值:
>>> david = car('David', 'Burger King')
>>> david.Driver
'David'
>>> david.Odometer
0
因此,现在您所缺少的是一种从drivers
dict中创建20个car
实例的方法
假设您需要一个将驾驶员姓名映射到car
实例的dict
,请使用dict理解:
cars = {driver: car(driver, sponsor) for driver, sponsor in drivers.items()}
或者,如果您只需要汽车实例的列表
,请改用列表:
cars = [car(driver, sponsor) for driver, sponsor in drivers.items()]
另一件事:按照您定义汽车的方式。\uuu init\uu
,您对每辆汽车的速度都使用一个随机数:
def __init__(self, Driver, Sponsor, Odometer=0,Speed=randint(1,121)):
当Python计算此函数定义时,它将调用randint(1121)
,并将结果作为每次调用函数的默认值
你想要的可能是这样的:
def __init__(self, Driver, Sponsor, Odometer=0, Speed=None):
if speed is None:
speed = randint(1,121)
最后,您的update
方法需要采用self
参数,并且需要使用该参数来访问或修改对象的属性,就像您的\uuuuu init\uuu
方法一样:
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
函数使用可选的键
,该函数告诉它排序或搜索的依据。而attrgetter(name)
是一个函数调用,它返回一个函数,该函数为任何对象获取名为name
的属性。有关详细信息,请参阅
为了进行比较,让我们明确地写下这一部分:
winner = None
for car in cars:
if winner is None or car.Odometer > winner.Odometer:
winner = car
这里有几个问题:
Speed
指的是一个局部变量。在car.update
中,未定义Speed
<代码>自我。速度是您需要的
def\uuu init\uuu(self,…,Speed=randint(1121)):
将为所有驾驶员提供相同的随机起动速度
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)
这里有几个问题:
速度
指本地va