在lis中复制元素

2024-04-19 06:05:23 发布

您现在位置:Python中文网/ 问答频道 /正文

说我有这个

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)

但它导致了一个无限循环。 任何帮助都将不胜感激。 我宁愿你们给我主意也不要给我密码。 谢谢。


Tags: in元素密码forrange次数主意append
3条回答

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

您的主要问题是,在遍历列表时对其进行修改是不安全的。你可以通过建立一个新的列表来解决这个问题——各种各样的itertools和comprehension答案显示了一些方法,或者如果你愿意的话,你可以使用你的for循环。

既然您需要的是想法而不是代码,我将指出itertools.repeat是另一个有用的工具。很明显,如何使用它来乘以列表中的给定元素,然后需要找出如何将列表中每个元素的迭代器组合成一个列表。为此,itertools.chain非常有用,可以使用*语法来解压repeat迭代器序列或itertools.chain.from_iterable构造函数。

这基本上与freyrs的答案相同,只是为每个元素创建一个repeat迭代器,而不是为每个元素创建一个列表并对其进行乘法运算。

您可以使用列表理解:

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

不过,我更喜欢列表理解法。

相关问题 更多 >