我想要扩展一个列表
[1,2,3,4]
由 n 提供
例如,当 n = 2 时:
[1,1,2,2,3,3,4,4]
我正在寻找最小可能的方法来实现这一点,不使用任何额外的库。
可以通过循环并将每个项目n次附加到新列表中轻松完成...但是是否还有其他方法?>>> l = [1,2,3,4]
>>> [it for it in l for _ in range(2)]
[1, 1, 2, 2, 3, 3, 4, 4]
[1, 2, [3]]
,然后按照你的方法操作,再执行test2[4].append(4)
,你会得到[1, 1, 2, 2, [3, 4], [3, 4]]
。显然,在大多数情况下这不会是个问题,但值得注意。 - Gareth Lattyitertools
[文档] 来拯救你:
expanded = list(chain(*izip(*tee(l, n))))
itertools
,但这让我头疼。 - Tim Pietzckerizip
„ÄÅtee
Âíåchain
Êù•Ëá™Âì™ÈáåÔºü - Marcin我在评论中已经记录了这一点,但如果能用答案解释,那会更容易,因为我可以给出完整的代码示例。请注意,这只是一个特定情况下的修改版本,更多的是作为其他回答的补充,而不是独立的完整回答。
如果您需要处理可变对象,则使用此处介绍的其他方法会遇到问题:
>>> 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]]
当然,这只适用于列表中可变对象,并且只有在您预计它们在创建新列表后会更改时才需要使用。
>>> 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]
sum([[x]*2 for x in l],[])
其中l
是您的列表
sum([[x,x,x] for x in l],[])
吗?这似乎不太方便。 - Felix Klingsum([[x]*3 for x in l],[])
。 - jamylak由于问题的作者在评论中回答说“最小可能的方式”是指代码长度最小,因此我敢于发布以下解决方案:
>>> sorted([1,2,3,4]*2)
[1, 1, 2, 2, 3, 3, 4, 4]
它的长度为19。
>>> 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]
>>> 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]
itertools
是标准库中的一部分,因此不使用它是愚蠢的。 - Gareth Latty