zip(*[iter(s)]*n)的反向操作是什么

3 投票
2 回答
688 浏览
提问于 2025-04-17 17:34

把一个列表分成相等的块可以用 zip(*[iter(s)]*n) 这个方法来实现。那么,有没有简单的方法可以把它恢复成原来的样子呢?

比如,我有以下这段代码:

>>> s = [3,4,1,2]
>>> zip(*[iter(s)]*2)
[(3, 4), (1, 2)]

有没有什么函数 func([(3,4),(1,2)] 能输出 [3,4,1,2] 呢?

补充:

关于时间和更多解决方案,可以在下面Dominic Kexel链接的问题中找到。

2 个回答

0

你可以使用 reduce 这个方法:

>>> import operator
>>> reduce(operator.add, [(3,4),(1,2)])
(3, 4, 1, 2)
3

这里提到了一种叫做 itertools.chain.from_iterable 的方法。

>>> import itertools
>>> s = [(3, 4), (1, 2)]
>>> list(itertools.chain.from_iterable(s))
[3, 4, 1, 2]

不过,你也可以使用嵌套的列表推导式来实现同样的效果。

>>> s = [(3, 4), (1, 2)]
>>> [i for sub in s for i in sub]
[3, 4, 1, 2]

撰写回答