我想创建两个列表listOfA
和listOfB
来存储来自另一个列表s的A
和B
的索引。
s=['A','B','A','A','A','B','B']
输出应该是两个列表
listOfA=[0,2,3,4]
listOfB=[1,5,6]
我可以通过两个语句来做到这一点。
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--]
这样的东西
发布于 2014-01-09 22:55:07
在某种程度上,关键是生成一个由2个元素组成的列表,然后您可以解包:
listOfA, listOfB = [[idx for idx, x in enumerate(s) if x == c] for c in 'AB']
也就是说,我认为这样做很愚蠢,显式循环更具可读性。
发布于 2014-01-09 23:00:20
解决这个问题的一个很好的方法是使用defaultdict。正如@Martin已经说过的,列表理解不是生成两个列表的正确工具。使用defaultdict将使您能够使用单个迭代创建隔离。此外,您的代码不会受到任何形式的限制。
>>> 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])
发布于 2018-10-23 18:42:30
对于那些生活在边缘的人;)
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)])]
https://stackoverflow.com/questions/21023482
复制相似问题