【问题标题】:replicating elements in list [duplicate]复制列表中的元素[重复]
【发布时间】:2013-12-15 01:58:32
【问题描述】:

说我有这个

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)

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

【问题讨论】:

标签: python list replication


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果我想创建一个新列表而不是使用 for 循环修改现有列表怎么办?
    • 最简单的方法是 karthikr 的回答显示 - 在 for 循环之前声明一个新的空列表并附加到该列表。
    【解决方案3】:

    您可以使用列表推导:

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

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

    【讨论】:

      【解决方案4】:

      可以为此使用 itertools:

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

      提供输出:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-30
        • 2020-01-19
        • 2023-04-05
        • 1970-01-01
        • 2012-10-10
        • 2022-01-24
        相关资源
        最近更新 更多