通过n扩展列表的最小方法

时间:2012-04-08 11:20:38

标签: python list

我想扩展一个列表

[1,2,3,4]

n

e.g。对于n = 2:

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

我正在寻找实现这一目标的最小方法,而无需任何额外的库。 它很容易做一个循环并将每个项目附加n次到一个新的列表......但还有另一种方法吗?

8 个答案:

答案 0 :(得分:13)

>>> l = [1,2,3,4]
>>> [it for it in l for _ in range(2)]
[1, 1, 2, 2, 3, 3, 4, 4]

答案 1 :(得分:5)

itertools [docs]救援:

expanded = list(chain(*izip(*tee(l, n))))

答案 2 :(得分: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]]

当然,这只是列表中可变对象的必要条件,并且只有在您希望它们在创建新列表后才能更改时。

答案 3 :(得分: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]

答案 4 :(得分:2)

sum([[x]*2 for x in l],[])

其中l是您的列表

答案 5 :(得分:0)

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

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

它的长度是19。

答案 6 :(得分: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]

答案 7 :(得分: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]