【问题标题】:Python Inline GeneratorPython 内联生成器
【发布时间】:2020-03-05 17:51:59
【问题描述】:

我正在尝试将一个值插入到一个列表中。

interleave(1, ['A', 'B', 'C']) -> [1, 'A', 1, 'B', 1, 'C']

有很多方法可以解决这个问题,但我认为more_itertools.interleave 是最易读的。然而,要使用这个函数,我需要创建一个生成器,它永远产生1。显然这可以用

def gen1():
    while True:
        yield 1

但这感觉比必要的复杂。

有没有一种优雅的方法来替换下面 sn-p 中的... 来创建一个内联生成器,这样

res = more_itertools.interleave(..., ['A', 'B', 'C'])
assert list(res) == [1, 'A', 1, 'B', 1, 'C']

... = (1 for _ in ['A', 'B', 'C']) 显然有效,但我不会称之为优雅。

【问题讨论】:

  • 那个生成器不会永远产生 1... 它产生 1 一次... 无论如何,你想要 itertools.repeat(1)

标签: python python-3.x generator


【解决方案1】:

itertools.repeat。我不知道interleave是如何实现的,但是你可以用chainzip做同样的事情:

from itertools import chain, repeat

print(list(chain.from_iterable(zip(repeat(1), ['A', 'B', 'C']))))
# [1, 'A', 1, 'B', 1, 'C']

【讨论】:

    【解决方案2】:

    你也可以像这样使用列表推导:

    def interleave(value, lst):
        return [j for i in lst for j in (value, i)]
    

    这样interleave(1, ['A', 'B', 'C']) 返回:

    [1, 'A', 1, 'B', 1, 'C']
    

    【讨论】:

      【解决方案3】:
      def interleave(a,list1):
          newlist=[]
          for x in list1:newlist.extend([a,x])
          return newlist
      print(interleave(1,['A','B','C']))
      

      打印

      [1, 'A', 1, 'B', 1, 'C']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2014-05-24
        相关资源
        最近更新 更多