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次.
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 那样。使用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)
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |