Python:检查命名元组的列表是否包含特定的属性值

时间:2017-07-04 22:15:19

标签: python list namedtuple

我有一个名为元组的列表:

from collections import namedtuple

T = namedtuple('T', ['attr1', 'attr2', 'attr3', 'attr4'])
t1 = T('T1', 1, '1234', 'XYZ')
t2 = T('T2', 2, '1254', 'ABC')
t3 = T('T2', 2, '1264', 'DEF')
l = [t1, t2, t3]

我想检查T列表attr1 = 'T2'中是否存在元素。

通过执行以下操作检查列表是否包含此类元素:

any(x for x in l if x.attr1 == 'T2')

只返回有关这样一个命名元组是否在列表中的信息 我也想从列表中弹出这个名字元组 一种方法是:

if any(x for x in l if x.attr1 == 'T2'):
   result = [x for x in l if x.attr1 == 'T2'].pop()

但是,我不喜欢这个解决方案,因为我循环遍历列表l两次。

有没有更好/更优雅的方式呢?

4 个答案:

答案 0 :(得分:2)

老派的循环怎么样?简单,优雅,只需循环一次。

for x in l:
    if x.attr1 == 'T2':
        break

result = x

答案 1 :(得分:1)

或者您可以使用x.name=y.name

next

答案 2 :(得分:1)

如果您需要一个项目并且不想弹出,可以将next与现有的生成器表达式一起使用:

result = next(x for x in l if x.attr1 == 'T2')

答案 3 :(得分:1)

如果允许将结果作为数组获取:

result = filter(lambda x: x.attr1 == 'T2', l)

或者,如果你只想得到一个:

result = filter(lambda x: x.attr1 == 'T2', l).pop()