【问题标题】:Concatenate items in two nested lists to pairs in tuples将两个嵌套列表中的项目连接到元组中的对
【发布时间】:2014-01-17 16:57:00
【问题描述】:

我有两个嵌套列表:

ls1 = [["a","b"], ["c","d"]]
ls2 = [["e","f"], ["g","h"]]

我想要以下结果 [(a,e), (b,f), (c,g), (d,h)]

我尝试过 zip(a,b),如何将嵌套列表压缩到包含元组对的列表中?

【问题讨论】:

    标签: python list zip nested tuples


    【解决方案1】:

    您可以在list comprehension 中使用两次zip

    >>> ls1 = [["a","b"], ["c","d"]]
    >>> ls2 = [["e","f"], ["g","h"]]
    >>> [y for x in zip(ls1, ls2) for y in zip(*x)]
    [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', 'h')]
    >>>
    

    【讨论】:

      【解决方案2】:

      一种惯用的方法是在压缩列表之前使用星号和itertools.chain 将列表展平。星号表示法将可迭代解包为函数的参数,而itertools.chain 函数将其参数中的可迭代链接在一起成为单个可迭代。

      
      
          ls1 = [["a","b"], ["c","d"]]
          ls2 = [["e","f"], ["g","h"]]
      
          import itertools as it
          zip(it.chain(*ls1), it.chain(*ls2))
      
      

      【讨论】:

        【解决方案3】:

        你需要扁平化你的列表,可以使用reduce

        from functools import reduce # in Python 3.x
        from operator import add
        zip(reduce(add, ls1), reduce(add, ls2))
        

        【讨论】:

        • 请注意,如果您的列表很长,这将很快因每次添加的重复创建新列表而陷入困境。
        【解决方案4】:

        你也可以使用itertools.chain.from_iterablezip

        >>> ls1 = [["a","b"], ["c","d"]]
        >>> ls2 = [["e","f"], ["g","h"]]
        >>> 
        >>> zip(itertools.chain.from_iterable(ls1), itertools.chain.from_iterable(ls2))
        [('a', 'e'), ('b', 'f'), ('c', 'g'), ('d', 'h')]
        

        【讨论】:

        • 很好,但使用itertools.chain 而非itertools.chain.from_iterable 会提高可读性。 (是的,我知道from_iterable 版本更快。)
        • @StevenRumbalski,或cfi = itertools.chain.from_iterable ;)
        猜你喜欢
        • 2014-06-04
        • 1970-01-01
        • 2021-04-26
        • 2014-06-28
        • 1970-01-01
        • 2014-05-31
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        相关资源
        最近更新 更多