根据另一个列表中的元素,重复一个列表中的元素

10

给定以下列表:

a = [0, 5, 1]
b = [1, 2, 1]

我想通过[b]中每个相应位置的数字来重复[a]中的每个元素,得到以下结果:
[0, 5, 5, 1]

即0出现1次,5出现2次,1出现1次。

2
看起来你想让我们为你编写一些代码。虽然很多用户愿意帮助有困难的程序员编写代码,但他们通常只会在发帖者已经尝试过自己解决问题时才提供帮助。展示这种努力的好方法是包括你已经编写的代码、示例输入(如果有的话)、期望输出以及实际获得的输出(控制台输出、堆栈跟踪、编译器错误——任何适用的内容)。提供的细节越多,你可能会收到更多的答案。 - Martijn Pieters
这回答你的问题吗?在另一个列表中指定次数重复每个项目 - Georgy
4个回答

9
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]

这里的内容如下:
  • itertools.repeat(elem, n) - 重复 elem n 次
  • zip(a, b) - 将两个列表中的每个元素一一对应,形成一个由二元组组成的列表。这正好是你在使用中需要传递给 itertools.repeat 的内容。
  • itertools.chain - 将迭代器生成的结果列表扁平化为一个值列表。你可以像我一样使用 chain(*iterable) 或者像 Martijn Peters 那样使用 chain.from_iterable(iterable)

7
使用 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)))

我为那些暂时无法迁移到Python 3的人添加了一个Python 2向前兼容的导入(future_builtins.zip)

演示:

>>> 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]

另一种方法是使用列表推导式;尽管重复元素的处理是在字节码中而不是C中完成,但速度会比较慢:

[value for value, count in zip(a, b) for _ in range(count)]

4

使用enumerate()函数可以直接完成此操作:

a = [0, 5, 1]
b = [1, 2, 1]
[ele for i, ele in enumerate(a) for j in range(b[i])]

0

使用列表推导式,你想要获得的是:

[a[0]]*b[0] + [a[1]]*b[1] + [a[2]]*b[2]

对于短列表,可以方便地使用sum(list, [])来实现。

内置函数sum在sum(list, [])中的作用是什么?

对于短列表而言,这可能比itertools.chain + itertools.repeat更快(更直接)。

sum([ [a_i]*b_i for a_i, b_i in zip(a, b) ], [])

对于长列表,请使用 itertools.chainitertools.repeat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接