基于另一个元素的一个列表中的Python重复元素

Dan*_*ty2 3 python repeat python-3.x

鉴于以下列表:

a = [0, 5, 1]
b = [1, 2, 1]
Run Code Online (Sandbox Code Playgroud)

我想用[b]中相应位置的数字重复[a]的每个元素来产生这个:

[0, 5, 5, 1]
Run Code Online (Sandbox Code Playgroud)

即0发生1次,5发生2次,1发生1次.

Two*_*ist 8

In [7]: a = [0, 5, 1]

In [8]: b = [1, 2, 1]

In [9]: list(itertools.chain(*(itertools.repeat(elem, n) for elem, n in zip(a, b))))
Out[9]: [0, 5, 5, 1]

In [10]: b = [2, 3, 4]

In [11]: list(itertools.chain(*(itertools.repeat(elem, n) for elem, n in zip(a, b))))
Out[11]: [0, 0, 5, 5, 5, 1, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

这里的片段如下:

  • itertools.repeat(elem, n) - 重复元素 n 次
  • zip(a, b)从两个列表中创建一个 2 元组列表,将每个元素与另一个列表中的相应元素配对。这为您提供了itertools.repeat在用例中需要传递的内容。
  • itertools.chain- 将生成的迭代器列表展平为单个值列表。您可以chain(*iterable)像我所做的那样,也可以chain.from_iterable(iterable)像 Martijn Peters 那样。


Mar*_*ers 5

使用zip()功能itertools.repeat()itertools.chain.from_iterable():

try:
    # use iterator zip on Python 2 too
    from future_builtins import zip
except ImportError:
    pass
from itertools import repeat, chain

list(chain.from_iterable(repeat(value, count) for value, count in zip(a, b)))
Run Code Online (Sandbox Code Playgroud)

(我为那些无法切换到Python 3的人添加了Python 2向前兼容导入).

演示:

>>> from itertools import repeat, chain
>>> a = [0, 5, 1]
>>> b = [1, 2, 1]
>>> list(chain.from_iterable(repeat(value, count) for value, count in zip(a, b)))
[0, 5, 5, 1]
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用列表理解; 这是慢的,因为重复元素是在字节码而不是C中完成的:

[value for value, count in zip(a, b) for _ in range(count)]
Run Code Online (Sandbox Code Playgroud)