遍历可迭代的zip()

时间:2019-01-08 11:40:28

标签: python list-comprehension

我有2个大小相同的列表,一个是向量列表,第二个是它们各自的标签:

UITextField

我想列出2个列表,所有(vi,tag)的标签都是真实的,这是恭维。 我正在尝试使用zip函数,例如:

l = [v1, v2,...]
tags = [True,False,...]

两个列表都变为空。我在这里看不到问题,“ x”应代表元组(vi,tag)

2 个答案:

答案 0 :(得分:2)

无需使用is,您可以直接检查布尔值。 is运算符用于检查对象的身份,并引用链接的文档:

  

运算符是否测试对象身份:x为y为真   当且仅当x和y是同一对象时。对象标识为   使用id()函数确定。 x不是y产生反函数   真值

代码

l = list(range(5))
tags = [True, False, True, False, False]

true_grp = [x for x in zip(l,tags) if x[1]]
false_grp = [x for x in zip(l,tags) if not x[1]]

print(true_grp)
print(false_grp)

输出

[(0, True), (2, True)]
[(1, False), (3, False), (4, False)]

答案 1 :(得分:1)

您的解决方案应该可以正常工作,但是为清楚起见,您可以在列表理解范围内解包项目。请注意,您应该通过x测试布尔值if x

true_grp = [(value, flag) for value, flag in zip(l, tags) if flag]
false_grp = [(vale, flag) for value, flag in zip(l, tags) if not flag]

由于这些列表是链接的,因此更好的方法是使用字典来存储“ True”和“ False”值。 collections.defaultdict很方便:

from collections import defaultdict

grp = defaultdict(list)
for value, flag in zip(l, tags):
    grp[flag].append(value)

然后使用grp[0]grp[False]代替false_grp;同样,用grp[1]grp[True]代替true_grp

基于一遍字典的解决方案还具有为任意可迭代对象ltags工作的优势。如果这些迭代器中的任何一个都是迭代器,则列表理解解决方案不适用于false_grp,因为可迭代对象只能被遍历一次。