如何按属性访问列表中的对象?

2024-10-16 20:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一个对象列表和一个在一个对象上工作的方法:

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,我怀疑有一种更直接的方法。有?


Tags: 对象方法nameself列表deftastyappend
3条回答

为了完整起见,我找到了一种使用Linq-like single-line statement的方法,它的优点是易于阅读:

taste = [b.taste for b in beers if b.name==name][0]

末尾的[0]返回第一个项,因为查询返回匹配项的列表。所以要得到整个列表:

^{pr2}$

这就是为什么我喜欢Python!在

只需循环查看列表并检查每个列表。在

但是您需要稍微移动一下代码,因为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

不过,我会这样做(使用这里的字典可以灵活地拥有多个属性):

^{pr2}$

如果你只想储存味道,你可以这样做:

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

这可以扩展到任何对象类型,我相信这正是您要寻找的

例如

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

实在想不出更好的方法了,只需使用for-循环。在

def howIsBeer(name):
    for beer in beers:
        if beer.name == name:
            return beer.taste

In [1]: howIsBeer("Carlsburg")
Out[1]: tasty

还要注意,关键字class是用小的c编写的。在使用类创建实例之前,还必须先定义类。在

编辑: 正如注释中所建议的,一种方法是定义字典。如果您觉得有用,可以使用下面的代码。但是,请注意,只有当您拥有大量啤酒对象且性能速度对您非常重要时,才建议使用此方法。否则使用提供的第一个代码

^{pr2}$

相关问题 更多 >