【问题标题】:Create a list of tuples from two nested lists从两个嵌套列表创建元组列表
【发布时间】:2015-04-29 16:41:04
【问题描述】:

有一个具有任意嵌套程度的列表A,以及一个具有与A(或更深)的嵌套结构等效的列表B,我们如何创建一个列表所有相应元素的元组?例如:

A = ['a', ['b', ['c', 'd']], 'e'] 
B = [1, [2, [3, [4, 5]]], 6]
>>>
[('a', 1), ('b', 2), ('c', 3), ('d', [4, 5]), ('e', 6)]

【问题讨论】:

    标签: python list nested tuples


    【解决方案1】:

    基本上,如果a 的当前元素不是列表,您需要做的就是同时迭代ab 并返回ab 的值。由于您的结构是嵌套的,因此我们无法对它们进行线性迭代。这就是我们使用递归的原因。

    此解决方案假定B 中的每个元素始终有一个对应的元素A

    def rec(a, b):
        if isinstance(a, list):
            # If `a` is a list
            for index, item in enumerate(a):
                # then recursively iterate it
                for items in rec(item, b[index]):
                    yield items
        else:
            # If `a` is not a list, just yield the current `a` and `b`
            yield a, b
    
    print(list(rec(['a', ['b', ['c', 'd']], 'e'], [1, [2, [3, [4, 5]]], 6])))
    # [('a', 1), ('b', 2), ('c', 3), ('d', [4, 5]), ('e', 6)]
    

    【讨论】:

      【解决方案2】:

      你想要一个递归的 zip 函数:

      from itertools import izip
      def recurse_zip(a, b):
          zipped = izip(a, b)
          for t in zipped:
              if isinstance(t[0], list):
                  for item in recurse_zip(*t):
                      yield item
              else:
                  yield t
      

      演示:

      >>> A = ['a', ['b', ['c', 'd']], 'e'] 
      >>> B = [1, [2, [3, [4, 5]]], 6]
      >>> print(list(recurse_zip(A, B)))
      [('a', 1), ('b', 2), ('c', 3), ('d', [4, 5]), ('e', 6)]
      

      注意事项:

      • izip 有助于让它变得懒惰——python3.x 的 zip 也可以。
      • 可以在 python3.3+ (yield from recurse_zip(*t)) 中使用yield from 语法。
      • 发电机很棒。

      【讨论】:

        【解决方案3】:

        你可以用 zip 迭代来创建一个列表,

        A = ['a', ['b', ['c', 'd']], 'e'] 
        B = [1, [2, [3, [4, 5]]], 6]
        
        def make_tuples(list1, list2):
            tups = []
            def _helper(l1, l2):
                for a, b in zip(l1, l2):
                    if isinstance(a, list) and isinstance(b, list):
                        _helper(a, b)
                    else:
                        tups.append((a, b))
            _helper(list1, list2)
            return tups
        
        make_tuples(A, B)
        

        或者一个简单的元组生成器 -

        def tuples_generator(l1, l2):
            for a, b in zip(l1, l2):
                if isinstance(a, list) and isinstance(b, list):
                    tuples_generator(a, b)
                else:
                    yield (a, b)
        
        In : make_tuples(A, B)
        Out: [('a', 1), ('b', 2), ('c', 3), ('d', [4, 5]), ('e', 6)]
        

        【讨论】:

          【解决方案4】:

          你可以使用 zip,这是我的答案。

          a = ['a', ['b', ['c', 'd']], 'e']
          b = [1, [2, [3, [4, 5]]], 6]
          c = []
          
          def CheckIfList(a):
              for k in a:
                  print 'k is:', k
                  if isinstance(k, (list, tuple)):
                      return True
              return False
          
          def ZipAllElements(a, b, c):
              if CheckIfList(a):
                  r = zip(a, b)
                  for i in r:
                      if isinstance(i[0], (list, tuple)):
                          ZipAllElements(i[0], i[1], c)
                      else:
                          c.append(i)
              else:
                  c.extend(list(zip(a, b)))
          
          ZipAllElements(a, b, c)
          print c
          

          【讨论】:

            【解决方案5】:
            In [3]: from compiler.ast import flatten
            
            In [4]: zip(flatten(A), flatten(B))
            Out[4]: [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
            

            【讨论】:

              猜你喜欢
              • 2022-12-08
              • 2014-02-11
              • 2021-08-14
              • 1970-01-01
              • 1970-01-01
              • 2014-02-02
              • 1970-01-01
              • 2020-02-27
              相关资源
              最近更新 更多