Python中的列表理解:如果条件得到验证,请执行额外的循环,否则不要为循环做额外的操作

时间:2018-06-09 13:40:46

标签: python python-2.7 for-loop list-comprehension

我想写下以下内容:

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]

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

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

1 个答案:

答案 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"