Python:如果包含特定的属性值,则从命名元组列表中获取一个条目

时间:2017-07-19 10:52:53

标签: python list namedtuple

我有一个list namedtuples,如下所示

fruits = Fruits['type', 'color', 'weight', 'sweetness']
f1 = fruits('apple', 'red', 1.89, 5)
f1 = fruits('pear', 'green', 2.89, 7)
f1 = fruits('banana', 'yellow', 2.01, 10)

l = [f1, f2, f3]

现在,我希望有一个函数从给定namedtuple的列表中返回特定的type。我使用for循环编写了这个函数,但有可能做得更好(更快或没有循环)?

def take_fruit(type, all_fruits):
    for f in all_fruits:
        if f.type == type:
           return f
    return None

2 个答案:

答案 0 :(得分:3)

您可以使用filter或列表理解来使代码缩短,但不一定更快

def take_fruit_listcomp(type, all_fruits):
    try:
        return [f for f in all_fruits if f.type == type][0]
    except IndexError:
        return None

def take_fruit_filter(type, all_fruits):
    try:
        # no need for list(..) if you use Python 2
        return list(filter(lambda f: f.type == type, all_fruits))[0]
    except IndexError:
        return None

答案 1 :(得分:0)

只有在没有重复类型的情况下才能使用此方法。您可以使用词典。

d = {
"apple" : fruits('apple', 'red', 1.89, 5),
"pear" : fruits('pear', 'green', 2.89, 7),
"banana" : fruits('banana', 'yellow', 2.01, 10)
}

def take_fruit(type)
    return list(d[type])

这里,字典将类型存储为键。这种方式更快