我想写下以下内容:
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]
有什么想法吗?是否可以在一个语句中执行它而不创建两个列表并将它们放在一起?
如果我需要提供更多信息,请告诉我。
答案 0 :(得分:3)
您希望展平嵌套列表,这需要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*2
为奇数时,只需添加x
。大多数人会发现它更具可读性,即使它不是" one-liner"