说我有这个
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)
但它导致了一个无限循环。 任何帮助,将不胜感激。 我希望你们给出想法而不是给我代码。 感谢。
答案 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]