zip()
带有和的紧凑版本itertools.chain.from_iterable
:
from itertools import chain
list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))
演示:
>>> B = [6, 2, 7, 1, 3, 5, 1, 9, 2, 0]
>>> from itertools import chain
>>> list(chain.from_iterable([v] * c for c, v in zip(*([iter(B)]*2))))
[2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 9, 0, 0]
打破这个:
zip(*([iter(B)]*2)))
对计数与值:
>>> zip(*([iter(B)]*2))
[(6, 2), (7, 1), (3, 5), (1, 9), (2, 0)]
从输入可迭代中获取对是一个相当标准的 Python 技巧。
([v] * c for c, v in zip(*([iter(B)]*2)))
是一个生成器表达式,它接受计数和值并生成具有重复计数次数的值的列表:
>>> next([v] * c for c, v in zip(*([iter(B)]*2)))
[2, 2, 2, 2, 2, 2]
chain.from_iterable
获取由生成器表达式生成的各种列表,并让您遍历它们,就好像它们是一个长列表一样。
list()
把它全部变回一个列表。