gpt4 book ai didi

python - Python 中的列表理解 : do extra for loop if condition is verified otherwise don't make extra for loop

转载 作者:太空宇宙 更新时间:2023-11-03 10:50:49 28 4
gpt4 key购买 nike

我想写以下内容:

result = []

for x in list(range(10)):
if x%2 != 0:
for a in [1,2]:
result.append(a*x)
else:
result.append(x)

具有列表理解力。

到目前为止我得到的最好的是:

[[a*x for a in [1,2]] if x%2!=0 else x for x in list(range(10))]

但它返回:

[0, [1, 2], 2, [3, 6], 4, [5, 10], 6, [7, 14], 8, [9, 18]]

我想得到这个:

[0, 1, 2, 2, 3, 6, 4, 5, 10, 6, 7, 14, 8, 9, 18]

有什么想法吗?是否可以在一个语句中完成而不创建两个列表并将它们放在一起?

如果我需要提供更多信息,请告诉我。

最佳答案

你想压平一个嵌套列表,这需要 itertools.chain:

一行:

>>> list(itertools.chain.from_iterable([a*x for a in [1,2]] if x%2 else [x] for x in range(10)))

结果:

[0, 1, 2, 2, 3, 6, 4, 5, 10, 6, 7, 14, 8, 9, 18]

将列表或单个元素生成为列表(需要链接元素)。也不要做 list(range(10))range(10) 就够了。

在这种情况下,您还可以通过预先计算循环来避免内部 listcomp:

list(itertools.chain.from_iterable([x,x*2] if x%2 else [x] for x in range(10)))

并且只有一个平面列表理解在生成器理解上迭代:

[z for y in ([x,x*2] if x%2 else [x] for x in range(10)) for z in y]

作为结论,在这个特定的例子中,一个好的旧循环有什么问题,稍微修改你的:

result = []
for x in range(10):
result.append(x)
if x%2:
result.append(x*2)

x 每次都会附加,所以当 x 为奇数时,只需附加 x*2 即可。大多数人会发现它更具可读性,即使它不是“单行”

关于python - Python 中的列表理解 : do extra for loop if condition is verified otherwise don't make extra for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50774884/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com