10

我想扩展一个列表

[1,2,3,4]

n

例如对于 n = 2:

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

我正在寻找在没有任何额外库的情况下实现这一目标的最小方法。它很容易做一个循环并将每个项目 n 次附加到一个新列表中......但是还有其他方法吗?

4

8 回答 8

13
>>> l = [1,2,3,4]
>>> [it for it in l for _ in range(2)]
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-04-08T11:25:45.387 回答
5

itertools [文档]救援:

expanded = list(chain(*izip(*tee(l, n))))
于 2012-04-08T11:22:45.433 回答
4

我在评论中注意到了这一点,但在答案中更容易解释,所以我可以给出完整的代码示例。请注意,这更像是对其他人的伴侣回答,而不是其本身的完整回答。它只是针对特定情况的修改。

如果您需要对可变对象执行此操作,请使用此处介绍的其他方法遇到障碍:

>>> l = [1,2,3,[4]]
>>> test = [it for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4, 5]]

copy.deepcopy()因此,如果你想避免这种行为,你需要使用。

>>> import copy
>>> l = [1,2,3,[4]]
>>> test = [copy.deepcopy(it) for it in l for _ in range(2)]
>>> test
[1, 1, 2, 2, 3, 3, [4], [4]]
>>> test[6].append(5)
>>> test
[1, 1, 2, 2, 3, 3, [4, 5], [4]]

当然,这仅对列表中的可变对象是必需的,并且仅当您希望它们在创建新列表后发生更改时才需要。

于 2012-04-08T11:38:09.250 回答
2
>>> from itertools import chain, tee
>>> x = [1, 2, 3, 4]
>>> n = 2
>>> list(chain.from_iterable(zip(*tee(x, n))))
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-04-08T11:30:36.573 回答
2
sum([[x]*2 for x in l],[])

l你的清单在哪里

于 2012-04-08T11:37:47.973 回答
0

由于问题的作者在评论中回答“尽可能最小的方式”是指代码的最小长度,因此我敢于发布以下解决方案:

>>> sorted([1,2,3,4]*2)
[1, 1, 2, 2, 3, 3, 4, 4]

它的长度是 19。

于 2012-04-10T20:19:20.963 回答
0
>>> from itertools import repeat, chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(repeat(x, 2) for x in seq))
[1, 1, 2, 2, 3, 3, 4, 4]
于 2012-08-01T06:19:23.423 回答
0
>>> from itertools import chain
>>> seq = [1, 2, 3, 4]
>>> list(chain.from_iterable(zip(*[seq]*2)))
[1, 1, 2, 2, 3, 3, 4, 4]
>>> list(chain.from_iterable(zip(*[seq]*6)))
[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
于 2012-08-01T06:21:28.463 回答