说我有这个清单:
[1,2,3,4]
我希望:
[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4]
这样做的最佳方式是什么?
我目前的方法是创建一个新列表:
x = [1,2,3,4]
y = [[n]*4 for n in x]
这给出了:
[[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]
这似乎很接近,但没有雪茄......有人可以帮忙吗?
答案 0 :(得分:13)
>>> x = [1,2,3,4]
>>> [n for n in x for _ in range(4)]
[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]
itertools.repeat
确实在语义上更清洁,谢谢,Steven:
from itertools import repeat
[repeated for value in x for repeated in repeat(value, 4)]
答案 1 :(得分:2)
您可以使用itertools.chain()
或chain.from_iterable()
展平列表清单(y
):
In [23]: lis=[1,2,3,4]
In [24]: from itertools import chain
In [31]: y = list(chain(*([n]*4 for n in lis)))
In [32]: y
Out[32]: [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4]
一些性能比较:
In [25]: x=[1,2,3,4]*1000 #can't use more than 1000 due to limited RAM
In [26]: %timeit list(chain(*([n]*1000 for n in x)))
1 loops, best of 3: 196 ms per loop
In [27]: %timeit list(chain.from_iterable(([n]*1000 for n in x)))
1 loops, best of 3: 177 ms per loop
In [29]: %timeit [n for n in x for _ in xrange(1000)]
1 loops, best of 3: 388 ms per loop
#three more solutions;from @Steven Rumbalski
In [28]: %timeit [repeated for value in x for repeated in repeat(value,1000)]
1 loops, best of 3: 344 ms per loop
In [30]: %timeit list(chain.from_iterable(izip(*repeat(x,1000))))
1 loops, best of 3: 204 ms per loop
In [31]: %timeit list(chain(*izip(*repeat(x,1000))))
1 loops, best of 3: 238 ms per loop
答案 2 :(得分:1)
您始终可以使用reduce
reduce(lambda x, y: x+y, [[n]*4 for n in x])
答案 3 :(得分:1)
以下是我的表现。
x = [1,2,3,4]
y = x*4
y.sort()
简单又干净。
答案 4 :(得分:0)
简单的方法:
y = [n for n in x*4]
这将返回[1, 2, 3, 4, 1, 2, 3, 4, ...]
。
要按照您想要的顺序排列,您可以x = sorted(x)
或y = sorted([n for n in x*4])
。
这类似于y = sorted(x*4)
。
最好的方法是@Pavel Anossov如何表达:
y = [n for n in x for _ in range(4)]
这是最好的,因为它适用于任何序列,而sorted(x*4)
不保留顺序,仅适用于最初排序的列表。