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

时间:2012-12-04 12:48:37

标签: python oop list object

考虑一个对象列表和一个对一个对象起作用的方法:

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

3 个答案:

答案 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的原因!