【问题标题】:List Comprehension in Python: do extra for loop if condition is verified otherwise don't make extra for loopPython中的列表理解:如果条件得到验证,则执行额外的for循环,否则不要进行额外的for循环
【发布时间】:2018-06-09 13:40:45
【问题描述】:

我想写以下内容:

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]

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

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

【问题讨论】:

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


    【解决方案1】:

    您想要展平嵌套列表,这需要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。大多数人会发现它更具可读性,即使它不是“单行”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 2019-01-31
      • 1970-01-01
      • 2011-12-18
      • 2016-06-21
      • 1970-01-01
      • 2019-11-23
      相关资源
      最近更新 更多