【问题标题】:List comprehension with elements appearing twice元素出现两次的列表理解
【发布时间】:2017-01-20 12:00:02
【问题描述】:

假设我有列表

l = ['a', 'c', 'b']

而我想要的是一个列表,其中这些元素一个接一个地出现两次,所以

['a', 'a', 'c', 'c', 'b', 'b']

我想以最 Pythonic 的方式做到这一点。

我的半解决方案是做类似的事情

[[l[i], l[i]] for i in range(len(l))]

产生

[['a', 'a'], ['c', 'c'], ['b', 'b']]

从这里开始,我必须解析(遍历)列表以删除内部列表并获取单个平面列表。

有谁有更好的办法一次性做到这一点?显然,l * 2 之类的东西无济于事,因为它提供了['a', 'c', 'b', 'a', 'c', 'b'],我希望相同的元素相邻。

【问题讨论】:

    标签: python list list-comprehension


    【解决方案1】:
    l_2 = [item for item in l for i in range(n)]
    

    来源链接:Stackoverflow: Repeating elements of a list n times

    【讨论】:

    • 选择这个,因为它看起来更优雅。请注意,与@Yousaf 的答案相比,执行此操作的时间为1000000 loops, best of 3: 1.49 µs per loop,而@Yousaf 的答案为The slowest run took 5.32 times longer than the fastest. This could mean that an intermediate result is being cached. 1000000 loops, best of 3: 1.12 µs per loop
    • 我认为使用更长的列表来计时。三个要素是如此之短,以至于时间并不重要。对于上面的代码,我还得到了“最慢的运行时间比最快的运行时间长 5.41 倍”。
    【解决方案2】:

    仅使用list comprehension,您可以:

    [i for j in my_list for i in [j]*2]
    

    输出:

    >>> my_list = ['a', 'c', 'b']
    >>> [i for j in my_list for i in [j]*2]
    ['a', 'a', 'c', 'c', 'b', 'b']
    

    【讨论】:

      【解决方案3】:

      您可以zip 列表对自身,然后在列表理解中将其展平。

      >>> [i for j in zip(l,l) for i in j]
      ['a', 'a', 'c', 'c', 'b', 'b']
      

      【讨论】:

        【解决方案4】:

        你可以使用zip函数

        l = ['a', 'c', 'b']
        a = [i for j in zip(l,l) for i in j]
        print(a)
        

        输出

        ['a', 'a', 'c', 'c', 'b', 'b']
        

        【讨论】:

          【解决方案5】:

          更笼统的:

          def ntimes(iterable, times=2):
              for elt in iterable:
                  for _ in range(times):
                      yield elt
          

          【讨论】:

            【解决方案6】:

            这是一个没有列表理解的简短解决方案,使用直观的想法l*2

            sorted(l*2, key=l.index)
            #['a', 'a', 'c', 'c', 'b', 'b']
            

            【讨论】:

              【解决方案7】:

              如果你喜欢函数式方法,你可以这样做:

              from itertools import chain, tee
              
              l = ['a', 'c', 'b']
              n = 2
              
              list(chain.from_iterable(zip(*tee(l, n))))
              

              虽然这可能不如其他答案那么快,但它可以通过省略 list() 轻松用于任意迭代(尤其是当它们是无限的或你不知道它们何时结束时)。

              (请注意,其他一些答案也可以通过用生成器表达式替换它们的列表理解来适应任意迭代。)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-11-20
                • 1970-01-01
                • 1970-01-01
                • 2018-10-08
                • 1970-01-01
                • 1970-01-01
                • 2020-06-09
                相关资源
                最近更新 更多