我有一个名为元组的列表:
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
两次。
有没有更好/更优雅的方式呢?
答案 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()