【问题标题】:Inserting an element before each element of a list在列表的每个元素之前插入一个元素
【发布时间】:2017-01-15 11:58:48
【问题描述】:

我希望在列表的每个现有元素之前插入一个常量元素,即从:

['foo', 'bar', 'baz']

到:

['a', 'foo', 'a', 'bar', 'a', 'baz']

我尝试过使用列表推导,但我能做到的最好的事情是使用以下语句的数组数组:

[['a', elt] for elt in stuff]

结果如下:

[['a', 'foo'], ['a', 'bar'], ['a', 'baz']]

所以不完全是我想要的。可以使用列表理解来实现吗?以防万一,我使用的是 Python 3.5。

【问题讨论】:

    标签: python list python-3.x list-comprehension


    【解决方案1】:

    添加另一个循环:

    [v for elt in stuff for v in ('a', elt)]
    

    如果您需要可迭代版本而不是完整列表,则将itertools.chain.from_iterable()zip()itertools.repeat() 一起使用:

    from itertools import chain, repeat
    try:
        # Python 3 version (itertools.izip)
        from future_builtins import zip
    except ImportError:
        # No import needed in Python 3
    
    it = chain.from_iterable(zip(repeat('a'), stuff))
    

    【讨论】:

      【解决方案2】:

      一个简单的生成器函数在这里也能很好地工作:

      def add_between(iterable, const):
          # TODO: think of a better name ... :-)
          for item in iterable:
              yield const
              yield item
      
      list(add_between(['foo', 'bar', 'baz'], 'a')
      

      这可以让您避免嵌套的列表理解,并且可以非常直接地阅读和理解,但代价是稍微更冗长。

      【讨论】:

        【解决方案3】:

        你已经有了

           l =  [['a', 'foo'], ['a', 'bar], ['a', 'baz']]
        

        您可以使用

        将其展平
        [item for sublist in l for item in sublist]
        

        这甚至适用于任意长度的嵌套列表。

        【讨论】:

          猜你喜欢
          • 2015-09-11
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-09-21
          • 2016-03-12
          • 2021-06-27
          • 2018-12-08
          • 2017-03-05
          相关资源
          最近更新 更多