如何增大并填充Python列表的大小?

3 投票
5 回答
5232 浏览
提问于 2025-04-17 19:06

假设我有这样一个列表:

[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]]

看起来差不多,但还是不太对……有没有人能帮帮我?

5 个回答

1

你可以随时使用 reduce 这个方法。

reduce(lambda x, y: x+y, [[n]*4 for n in x])
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
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)]

撰写回答