首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建多个列表的Python列表理解

创建多个列表的Python列表理解
EN

Stack Overflow用户
提问于 2014-01-09 22:51:11
回答 3查看 31.2K关注 0票数 26

我想创建两个列表listOfAlistOfB来存储来自另一个列表s的AB的索引。

代码语言:javascript
运行
复制
s=['A','B','A','A','A','B','B']

输出应该是两个列表

代码语言:javascript
运行
复制
listOfA=[0,2,3,4]
listOfB=[1,5,6]

我可以通过两个语句来做到这一点。

代码语言:javascript
运行
复制
listOfA=[idx for idx,x in enumerate(s) if x=='A']
listOfB=[idx for idx,x in enumerate(s) if x=='B']

但是,我只想使用列表理解在一次迭代中完成它。可以在一条语句中完成吗?像listOfA,listOfB=[--code goes here--]这样的东西

EN

回答 3

Stack Overflow用户

发布于 2014-01-09 22:55:07

在某种程度上,关键是生成一个由2个元素组成的列表,然后您可以解包:

代码语言:javascript
运行
复制
listOfA, listOfB = [[idx for idx, x in enumerate(s) if x == c] for c in 'AB']

也就是说,我认为这样做很愚蠢,显式循环更具可读性。

票数 13
EN

Stack Overflow用户

发布于 2014-01-09 23:00:20

解决这个问题的一个很好的方法是使用defaultdict。正如@Martin已经说过的,列表理解不是生成两个列表的正确工具。使用defaultdict将使您能够使用单个迭代创建隔离。此外,您的代码不会受到任何形式的限制。

代码语言:javascript
运行
复制
>>> from collections import defaultdict
>>> s=['A','B','A','A','A','B','B']
>>> listOf = defaultdict(list)
>>> for idx, elem in enumerate(s):
    listOf[elem].append(idx)
>>> listOf['A'], listOf['B']
([0, 2, 3, 4], [1, 5, 6])
票数 6
EN

Stack Overflow用户

发布于 2018-10-23 18:42:30

对于那些生活在边缘的人;)

代码语言:javascript
运行
复制
listOfA, listOfB = [[i for i in cur_list if i is not None] for cur_list in zip(*[(idx,None) if value == 'A' else (None,idx) for idx,value in enumerate(s)])]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21023482

复制
相关文章

相似问题

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