【问题标题】:How to repeat each of a Python list's elements n times with itertools only?如何仅使用 itertools 将 Python 列表的每个元素重复 n 次?
【发布时间】:2018-01-29 15:41:36
【问题描述】:

我有一个带有数字的列表: numbers = [1, 2, 3, 4].

我想要一个列表,他们重复n 次(对于n = 3):

[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4].

问题是我只想为此使用itertools,因为我的性能非常有限。

我尝试使用这个表达式:

list(itertools.chain.from_iterable(itertools.repeat(numbers, 3)))

但它给了我这样的结果:

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

这显然不是我需要的。

有没有办法只使用itertools,而不使用排序、循环和列表推导?我能得到的最接近的是:

list(itertools.chain.from_iterable([itertools.repeat(i, 3) for i in numbers])),

但它也使用列表理解,我想避免。

【问题讨论】:

  • 您是否有避免列表推导的原因?它们非常快,而且性能通常与 itertools 一样。
  • 同样的问题,但对 itertools 没有限制:Repeating elements of a list n times

标签: python performance list iteration itertools


【解决方案1】:

首先,使用来自itertools 的函数不一定比列表推导更快——您应该对这两种方法进行基准测试。 (事实上​​,在我的机器上正好相反)。

纯列表理解方法:

>>> numbers = [1, 2, 3, 4]
>>> [y for x in numbers for y in (x,)*3]
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

chain.from_iterable()生成器表达式一起使用

>>> from itertools import chain, repeat
>>> list(chain.from_iterable(repeat(n, 3) for n in numbers))
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

【讨论】:

    【解决方案2】:

    既然你不想使用列表推导,下面是一个纯粹的 (+zip) itertools 方法来做到这一点 -

    from itertools import chain, repeat
    
    list(chain.from_iterable(zip(*repeat(numbers, 3))))
    # [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
    

    【讨论】:

      【解决方案3】:

      认为您非常接近,只是将理解重写为生成器:

      n = 3
      numbers = [1, 2, 3, 4]
      list(itertools.chain.from_iterable((itertools.repeat(i, n) for i in numbers)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 2017-03-10
        相关资源
        最近更新 更多