考虑一个对象列表和一个对一个对象起作用的方法:
beers = []
beers.append(Beer('Carlsberg', 'tasty'))
beers.append(Beer('Guinness', 'bitter'))
beers.append(Beer('Leffe', 'perfect'))
def howIsBeer (name):
taste = ???
print taste
Class Beer:
def __init__ (self, name, taste):
self.name = name
self.taste = taste
如果只提供啤酒名称,howIsBeer()
方法如何获得啤酒的味道? 我的第一个倾向是迭代beers
列表,但是Python我怀疑有更直接的方法。有吗?
答案 0 :(得分:3)
无法想到更好的方法,只需使用for
- 循环。
def howIsBeer(name):
for beer in beers:
if beer.name == name:
return beer.taste
In [1]: howIsBeer("Carlsburg")
Out[1]: tasty
另请注意,关键字class
是用小c
编写的。您还必须在之前定义您的类,然后使用它来创建实例。
修改强>: 正如提交中所建议的那样,一种方法是定义词典。如果您觉得它很有用,可以使用下面的代码。但是,请注意,只有在您拥有巨大数量的Beer对象并且性能速度对您来说非常重要时才建议使用此选项。否则使用提供的第一个代码
class Beer:
names = {}
def __init__(self, name, taste):
Beer.names[name] = self
self.name = name
self.taste = taste
In [3]: Beer.names["Carlsburg"].taste
Out[3]: tasty
答案 1 :(得分:3)
只需遍历列表并检查每个列表。
你需要稍微移动代码,因为class def
需要高于类的使用,并且它还使用了一个小的c
。你也应该留意它无法识别的情况。
你还错误地将嘉士伯拼写错误:/
class Beer:
def __init__ (self, name, taste):
self.name = name
self.taste = taste
beers = []
beers.append(Beer('Carlsberg', 'tasty'))
beers.append(Beer('Guinness', 'bitter'))
beers.append(Beer('Lef', 'perfect'))
def howIsBeer (name):
taste = "I have no idea"
for beer in beers:
if beer.name == name:
taste = beer.taste
print taste
howIsBeer("Carlsberg") # tasty
我会这样做(使用这里的词典可以灵活地拥有多个属性):
beers = {}
beers["Lef"] = {"taste": "tasty"}
beers["Staropramen"] = {"taste": "tasty"}
beers["Peroni"] = {"taste": "tasty"}
beers["Coors Light"] = {"taste": "What is this?!"}
def howIsBeer (name):
taste = "I have no idea"
if name in beers:
taste = beers[name]["taste"]
print taste
howIsBeer("Lef")
如果您只想存储品味,那么您可以这样做:
beers = {}
beers["Lef"] = "tasty"
beers["Staropramen"] = "tasty"
beers["Peroni"] = "tasty"
beers["Coors Light"] = "What is this?!"
def howIsBeer (name):
taste = "I have no idea"
if name in beers:
taste = beers[name]
print taste
howIsBeer("Lef")
如果您希望存储一系列对象 - 正如您在问题中提到的那样 - 那么您需要一个对象字典 - 不一个字典,它是该类的变量。
即
beers = {}
def add_beer(beer):
beers[beer.name] = beer
然后获取您正在查看的啤酒数据;
if beer in beers:
beers[beer].taste
这可以扩展到任何对象类型,我相信正是您正在寻找的;
e.g。
cheeses = {}
add_cheese(cheese):
cheeses[cheese.name] = cheese
,其中
class cheese:
def __init__(self, name, smelliness, hardness, colour, country):
self.name = name
self.smelliness = smelliness
self.hardness = hardness
self.colour = colour
self.country = country
答案 2 :(得分:0)
为了完整起见,我找到了一种使用Linq-like single-line statement的方法,它的优点还在于更容易阅读:
taste = [b.taste for b in beers if b.name==name][0]
最后的[0]
是返回第一个项目,因为查询返回匹配项目列表。所以要获得整个列表:
[b.taste for b in beers if b.name==name]
这就是我喜欢Python的原因!