【问题标题】:How to zip two lists of lists in Python?如何在 Python 中压缩两个列表列表?
【发布时间】:2011-11-20 10:37:45
【问题描述】:

我有两个具有相同数量项目的列表。这两个列表如下所示:

L1 = [[1, 2], [3, 4], [5, 6]]

L2 =[[a, b], [c, d], [e, f]]

我希望创建一个如下所示的列表:

Lmerge = [[1, 2, a, b], [3, 4, c, d], [5, 6, e, f]]

我试图使用 zip() 类似的东西:

for list1, list2 in zip(*L1, *L2):
    Lmerge = [list1, list2]

合并两个列表的最佳方法是什么?提前致谢。

【问题讨论】:

    标签: python list merge zip nested


    【解决方案1】:
    >>> map(list.__add__, L1, L2)
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    

    【讨论】:

    • ooo.. 我更喜欢这样! +1
    • 不是最快的,但肯定是最干净的之一!仍然有我的投票。 (以下答案之一的基准)
    【解决方案2】:
    >>> L1 = [[1, 2], [3, 4], [5, 6]]
    >>> L2 =[["a", "b"], ["c", "d"], ["e", "f"]]
    >>> [x + y for x,y in zip(L1,L2)]
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    

    或者,

    >>> [sum(x,[]) for x in zip(L1,L2)]
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    

    或者,

    >>> import itertools
    >>> [list(itertools.chain(*x)) for x in zip(L1,L2)]
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    

    我们也可以不用zip()

    >>> [L1[i] + L2[i] for i in xrange(min(len(L1), len(L2)))]  
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    
    >>> [x + L2[i] for i, x in enumerate(L1)]  # assuming len(L1) == len(l2)
    [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
    
    >>> # same as above, but deals with different lengths
    >>> Lx, Ly = ((L2,L1), (L1,L2))[len(L1)<=len(L2)] # shortcut for if/else
    >>> [x + Ly[i] for i, x in enumerate(Lx)]
    

    一些基准测试

    以下是迄今为止提供的答案的一些基准。

    看起来最受欢迎的答案 ([x + y for x,y in zip(L1,L2)]) 与 @hammar's map solution 差不多。 另一方面,我给出的替代解决方案已被证明是垃圾!

    然而,最快的解决方案(目前)似乎是那些使用列表解析而不使用 zip() 的解决方案。

    [me@home]$ SETUP="L1=[[x,x+1] for x in xrange(10000)];L2=[[x+2,x+3] for x in xrange(10000)]"
    
    [me@home]$ # this raises IndexError if len(L1) > len(L2)
    [me@home]$ python -m timeit "$SETUP" "[x + L2[i] for i, x in enumerate(L1)]"
    100 loops, best of 3: 10.6 msec per loop
    
    [me@home]$ # same as above, but deals with length inconsistencies
    [me@home]$ python -m timeit "$SETUP" "Lx,Ly=((L2,L1),(L1,L2))[len(L1)<=len(L2)];[x + Ly[i] for i, x in enumerate(Lx)]"
    100 loops, best of 3: 10.6 msec per loop
    
    [me@home]$ # almost as fast as above, but easier to read
    [me@home]$ python -m timeit "$SETUP" "[L1[i] + L2[i] for i in xrange(min(len(L1),len(L2)))]"
    100 loops, best of 3: 10.8 msec per loop
    
    [me@home]$ python -m timeit "$SETUP" "L3=[x + y for x,y in zip(L1,L2)]"
    100 loops, best of 3: 13.4 msec per loop
    
    [me@home]$ python -m timeit "$SETUP" "L3=map(list.__add__, L1, L2)" 
    100 loops, best of 3: 13.5 msec per loop
    
    [me@home]$ python -m timeit "$SETUP" "L3=[sum(x,[]) for x in zip(L1,L2)]"
    100 loops, best of 3: 18.1 msec per loop
    
    [me@home]$ python -m timeit "$SETUP;import itertools" "L3=[list(itertools.chain(*x)) for x in zip(L1,L2)]"
    10 loops, best of 3: 32.9 msec per loop
    

    @Zac's suggestion 确实很快,但是我们在这里比较的是苹果和橙子,因为它在L1就地 进行了列表扩展,而不是创建第三个列表。因此,如果不再需要 L1,这是一个很好的解决方案。

    [me@home]$ python -m timeit "$SETUP" "for index, x in enumerate(L1): x.extend(L2[index])"
    100 loops, best of 3: 9.46 msec per loop
    

    但是,如果 L1 必须保持原样,那么一旦包含 deepcopy,性能就会低于标准。

    [me@home]$ python -m timeit "$SETUP;from copy import deepcopy" "L3=deepcopy(L1)
    > for index, x in enumerate(L1): x.extend(L2[index])"
    10 loops, best of 3: 116 msec per loop
    

    【讨论】:

      【解决方案3】:

      您想用加号运算符组合子列表,并在列表推导中迭代它们:

      Lmerge = [i1 + i2 for i1, i2 in zip(L1, L2)]
      

      【讨论】:

        【解决方案4】:
        L1 = [[1, 2], [3, 4], [5, 6]]
        L2 =[[a, b], [c, d], [e, f]]
        
        Lmerge = [x + y for x, y in zip(L1, L2)]
        [[1, 2, 'a', 'b'], [3, 4, 'c', 'd'], [5, 6, 'e', 'f']]
        

        【讨论】:

          【解决方案5】:
          for index, x in enumerate(L1):
              x.extend(L2[index])
          

          【讨论】:

          • 不错的解决方案,但它会更改 L1 而不是创建新列表,所以这完全取决于是否仍然需要 L1
          猜你喜欢
          • 1970-01-01
          • 2015-11-04
          • 2013-11-09
          • 2020-07-16
          • 1970-01-01
          • 2010-11-07
          • 2011-05-05
          • 2019-06-16
          • 1970-01-01
          相关资源
          最近更新 更多