【问题标题】:Iterating over a zip() iterable迭代 zip() 可迭代对象
【发布时间】:2019-06-03 02:28:36
【问题描述】:

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

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

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

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

两个列表都是空的。我在这里看不到问题,'x'应该代表元组(vi,tag)

【问题讨论】:

  • 您的解决方案对我有用

标签: python list-comprehension


【解决方案1】:

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

运算符是和不是对象身份测试:x 是 y 是真的 当且仅当 x 和 y 是同一个对象。对象身份是 使用 id() 函数确定。 x is not 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)]

【讨论】:

  • 你刚刚改造了itertools.compress(有点)
  • @CodeHoarder 查看链接文档。
【解决方案2】:

您的解决方案应该可以正常工作,但为了清楚起见,您可以解压缩列表理解中的项目。请注意,您应该通过 if x 测试布尔值 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,因为一个可迭代对象只能被遍历一次。

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2015-11-28
    • 2014-04-26
    • 2018-01-23
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多