Python 列表理解技巧

Python list comprehension trick

这可能是个愚蠢的问题,但是...

list = []
for i in range(1, 5):
    for j in range(i):
        list.append(i)
print(list)

list2 = [[i]*i for i in range(1, 5)]
print(list2)

使用以下代码,我的输出类似于

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

我明白为什么第二个看起来像这样,但是有什么技巧可以理解第一个列表吗?
P.S.
Python3

[i for i in range(5) for j in range(i)] 应该可以解决问题。 您可以在列表理解中使用多个 for

这是你想要的吗?

>>> list2 = [i for i in range(1, 5) for j in range(i)]
>>> list2
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

诀窍是将类似的 for 循环以相同的顺序放入列表推导中(并且由于您不需要列表的列表,因此不要创建它们)。

虽然我更喜欢双 for,但您也可以使用 reducelist2:

list1 = reduce(lambda x, y: x + y, [[i] * i for i in range(1, 5)])
print list1
# [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

我可以从你的代码片段中添加 sum 以获得相同的输出:

>>> sum([[i]*i for i in range(1, 5)], [])
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>>

或使用减少:

>>> reduce(lambda x,y: x+y, [[i]*i for i in range(1, 5)])
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>>

如果您不喜欢这个解决方案,请告诉我。我会删除它。

使用 itertools,

from itertools import chain, repeat

list2 = list(chain.from_iterable(repeat(i, i) for i in range(1, 5)))

print(list2)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

[Program finished]