复制列表中的元素

时间:2013-11-28 23:24:38

标签: python list replication

说我有这个

b = 3
l = [1, 2]

我想修改l,以便每个元素出现的次数与b一样多。那样:

l = [1, 1, 1, 2, 2, 2]

我用过这个:

for x in l:
  for m in range(b):
    l.append(x)

但它导致了一个无限循环。 任何帮助,将不胜感激。 我希望你们给出想法而不是给我代码。 感谢。

4 个答案:

答案 0 :(得分:11)

我的2美分:

实现这一目标的另一种方法也是利用你可以在Python中乘以列表的事实。

>>> l = [1, 2, 3]
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

sorted函数的简单调用允许对其进行排序:

>>> b = 3    
>>> l = [1, 2]
>>> sorted(l * b)
[1, 1, 1, 2, 2, 2]

答案 1 :(得分:8)

您可以使用列表理解:

>>> b = 3
>>> x = [1, 2]
>>> l = [x for x in l for _ in range(b)]
>>> l
[1, 1, 1, 2, 2, 2]
>>>

现在,要解决您的问题:

您可能想要创建一个新列表,并附加到该列表

>>> l  = [1, 2]
>>> y = []
>>> b = 3
>>> for x in l:
...   for i in range(b):
...     y.append(x)
...
>>> y
[1, 1, 1, 2, 2, 2]

我更喜欢列表理解方法。

答案 2 :(得分:2)

您的主要问题是在迭代时修改列表是不安全的。您可以通过构建新列表来解决这个问题 - 各种itertools和理解答案显示了一些方法,或者如果您愿意,可以使用for循环。

由于您要求提供想法而不是代码,我会指出itertools.repeat是另一个有用的工具。如何使用它来乘以列表的给定元素应该是相当明显的 - 然后你需要弄清楚如何将列表中每个元素的迭代器组合成一个列表。为此,itertools.chain非常有用,可以使用*语法解压缩repeat迭代器序列或itertools.chain.from_iterable构造函数。

这与freyrs的回答基本相同,只是为每个元素创建一个repeat迭代器,而不是为每个元素创建和乘以一个列表。

答案 3 :(得分:0)

可以使用itertools:

from itertools import chain
list(chain(*[[i]*b for i in l]))

提供输出:

[1, 1, 1, 2, 2, 2]