用于创建多个列表的 Python 列表推导

标签 python list list-comprehension

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

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/

相关文章:

python - 如何在 nn.Sequential 模型中使用自定义 torch.autograd.Function

java - 避免向泛型列表多次添加内容

java - 生成 [0,1] 和限制小数之间的 float 随机数

python - 如何做这份 list

python - Django 数据库查询往返

python - 用字符串标记 matplotlib imshow 轴

python绝对XPath返回空列表,通用查询更好吗?

python - 为什么使用 zip 对象的列表理解会导致空列表?

python - 在Python中使用列表理解读取文本文件并将一些值转换为 float

python - django 在 View 函数中获取媒体 url