我想创建两个列表 listOfA
和 listOfB
来存储另一个列表中 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 在这里--]
最佳答案
列表推导式的定义是生成一个列表对象。您的 2 个列表对象甚至具有不同的长度;你必须使用副作用来实现你想要的。
这里不要使用列表推导。只需使用普通循环:
listOfA, listOfB = [], []
for idx, x in enumerate(s):
target = listOfA if x == 'A' else listOfB
target.append(idx)
这让您只需要执行 一个 循环;这将击败任何两个列表推导,至少直到开发人员找到一种方法使列表推导构建一个列表的速度是使用单独的 list.append()
调用的循环的两倍。
我会在任何一天都选择这个而不是嵌套列表理解只是以便能够在一行上生成两个列表。作为Zen of Python状态:
Readability counts.
关于用于创建多个列表的 Python 列表推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023482/