首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代zip()可迭代

迭代zip()可迭代
EN

Stack Overflow用户
提问于 2019-01-08 11:40:28
回答 2查看 148关注 0票数 1

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

代码语言:javascript
复制
l = [v1, v2,...]
tags = [True,False,...]

我想列出两个列表,所有的(vi,tag )标签都是真实的,这是恭维的。我试图使用zip函数来实现这样的功能:

代码语言:javascript
复制
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)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-08 11:42:43

不需要使用,您可以直接检查布尔值。is操作符用于检查对象标识,引用链接文档:

运算符是和不是测试对象标识:x是y是真当且仅当x和y是相同的对象。对象标识是使用id()函数确定的。X不是y,得到的是逆真值。

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
[(0, True), (2, True)]
[(1, False), (3, False), (4, False)]
票数 2
EN

Stack Overflow用户

发布于 2019-01-08 11:50:47

您的解决方案应该工作良好,但为了清晰起见,您可以在列表理解中解压项目。注意,您应该通过if x测试布尔型if x

代码语言:javascript
复制
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很方便:

代码语言:javascript
复制
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,因为可迭代只能遍历一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54091080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档