【问题标题】:Convert and join multiple nested list of lists转换并加入多个嵌套列表列表
【发布时间】:2017-02-23 16:37:40
【问题描述】:

我有以下嵌套列表:

a = [[[[-79.43402638260521, -1.69184588855758], [-79.4339722432865, -1.691845844583909], [-79.43397178076256, -1.691851284533779],
    [-79.43395283944169, -1.692053292637794], [-79.43395281911414, -1.692054736321033], [-79.43395535750368, -1.692093535418117],
    [-79.43390444734398, -1.69223087834723], [-79.43390428016939, -1.692231372437897], [-79.43374523144152, -1.692750043925838],
    [-79.4340256570161, -1.692750271834557], [-79.43402638260521, -1.69184588855758]]], [[[-79.43381375958064, -1.691845715849684],
    [-79.43312765678151, -1.691845158387183], [-79.4331269307764, -1.692749541273626], [-79.43354270912953, -1.692749879305633],
    [-79.43364983051107, -1.692588468489809], [-79.4336510738479, -1.692585646334773], [-79.43371548446397, -1.692327269168548],
    [-79.43380554258165, -1.692094789340216], [-79.43380615195998, -1.692091785860122], [-79.43381375958064, -1.691845715849684]]]]

我会怎样去:

a = [[-79.43402638260521, -1.69184588855758], [-79.4339722432865, -1.691845844583909], [-79.43397178076256, -1.691851284533779], 
[-79.43395283944169, -1.692053292637794], [-79.43395281911414, -1.692054736321033], [-79.43395535750368, -1.692093535418117], 
[-79.43390444734398, -1.69223087834723], [-79.43390428016939, -1.692231372437897], [-79.43374523144152, -1.692750043925838], 
[-79.4340256570161, -1.692750271834557], [-79.43402638260521, -1.69184588855758], [-79.43381375958064, -1.691845715849684], 
[-79.43312765678151, -1.691845158387183], [-79.4331269307764, -1.692749541273626], [-79.43354270912953, -1.692749879305633], 
[-79.43364983051107, -1.692588468489809], [-79.4336510738479, -1.692585646334773], [-79.43371548446397, -1.692327269168548], 
[-79.43380554258165, -1.692094789340216], [-79.43380615195998, -1.692091785860122], [-79.43381375958064, -1.691845715849684]]

所以基本上删除了嵌套列表和每个列表开头和结尾的双括号。我已经尝试了以下和 ittertools 没有成功:

flatten = lambda list: [item for sublist in list for item in sublist]

注意:len(a) == 2

非常感谢!

【问题讨论】:

  • 在你的特殊情况下,a[0][0]?
  • @CarlesMitjans,@Arman,len(a) == 2
  • @falsetru 你是对的,没注意到
  • @falsetru,确切地说,这就是为什么 a[0][0] 在这种情况下不起作用

标签: python list nested


【解决方案1】:

这样就可以了。

a = a[0][0] + a[1][0]

这可以扩展为,

a = sum([a[i][0] for i in range(len(a))], [])

【讨论】:

  • 这在我看来是最明智的解决方案。如果有两个以上的元素很容易,它也可以适应工作。
  • 没错!如果格式一致,这是最简单的方法。 @sphericalcowboy
  • 你们能评论下投票的原因吗?这不是一个“错误”的答案。
  • 是的。在列表的情况下,它有效,但它不是正确的方法。 :) 我会编辑它。
  • 感谢您的回答。这确实似乎是最合乎逻辑的解决方案,因为它不依赖于其他库。
【解决方案2】:

使用itertools.chain.from_iterable

list(itertools.chain.from_iterable(xs[0] for xs in a))

上面类似于:a[0][0] + a[1][0] + ...(没有导致列表创建的串联)


>>> a = [[[[-79.43402638260521, -1.69184588855758],
...        [-79.4339722432865, -1.691845844583909],
...        [-79.43397178076256, -1.691851284533779],
...        [-79.43395283944169, -1.692053292637794],
...        [-79.43395281911414, -1.692054736321033],
...        [-79.43395535750368, -1.692093535418117],
...        [-79.43390444734398, -1.69223087834723],
...        [-79.43390428016939, -1.692231372437897],
...        [-79.43374523144152, -1.692750043925838],
...        [-79.4340256570161, -1.692750271834557],
...        [-79.43402638260521, -1.69184588855758]]],
...      [[[-79.43381375958064, -1.691845715849684],
...        [-79.43312765678151, -1.691845158387183],
...        [-79.4331269307764, -1.692749541273626],
...        [-79.43354270912953, -1.692749879305633],
...        [-79.43364983051107, -1.692588468489809],
...        [-79.4336510738479, -1.692585646334773],
...        [-79.43371548446397, -1.692327269168548],
...        [-79.43380554258165, -1.692094789340216],
...        [-79.43380615195998, -1.692091785860122],
...        [-79.43381375958064, -1.691845715849684]]]]
>>> 
>>> import itertools
>>> import pprint
>>> b = list(itertools.chain.from_iterable(xs[0] for xs in a))
>>> pprint.pprint(b)

结果:

[[-79.43402638260521, -1.69184588855758],
 [-79.4339722432865, -1.691845844583909],
 [-79.43397178076256, -1.691851284533779],
 [-79.43395283944169, -1.692053292637794],
 [-79.43395281911414, -1.692054736321033],
 [-79.43395535750368, -1.692093535418117],
 [-79.43390444734398, -1.69223087834723],
 [-79.43390428016939, -1.692231372437897],
 [-79.43374523144152, -1.692750043925838],
 [-79.4340256570161, -1.692750271834557],
 [-79.43402638260521, -1.69184588855758],
 [-79.43381375958064, -1.691845715849684],
 [-79.43312765678151, -1.691845158387183],
 [-79.4331269307764, -1.692749541273626],
 [-79.43354270912953, -1.692749879305633],
 [-79.43364983051107, -1.692588468489809],
 [-79.4336510738479, -1.692585646334773],
 [-79.43371548446397, -1.692327269168548],
 [-79.43380554258165, -1.692094789340216],
 [-79.43380615195998, -1.692091785860122],
 [-79.43381375958064, -1.691845715849684]]

【讨论】:

    【解决方案3】:

    假设你的列表不是任意嵌套的,但你只是想更深一层,你可以选择一些非常简单的东西,比如

    a = [item for sublist in a for subsublist in sublist for item in subsublist]
    

    演示

    >>> a = [[[[-79.43402638260521, -1.69184588855758], [-79.4339722432865, -1.691845844583909], [-79.43397178076256, -1.691851284533779],
    [-79.43395283944169, -1.692053292637794], [-79.43395281911414, -1.692054736321033], [-79.43395535750368, -1.692093535418117],
    [-79.43390444734398, -1.69223087834723], [-79.43390428016939, -1.692231372437897], [-79.43374523144152, -1.692750043925838],
    [-79.4340256570161, -1.692750271834557], [-79.43402638260521, -1.69184588855758]]], [[[-79.43381375958064, -1.691845715849684],
    [-79.43312765678151, -1.691845158387183], [-79.4331269307764, -1.692749541273626], [-79.43354270912953, -1.692749879305633],
    [-79.43364983051107, -1.692588468489809], [-79.4336510738479, -1.692585646334773], [-79.43371548446397, -1.692327269168548],
    [-79.43380554258165, -1.692094789340216], [-79.43380615195998, -1.692091785860122], [-79.43381375958064, -1.691845715849684]]]]
    >>> desired = [[-79.43402638260521, -1.69184588855758], [-79.4339722432865, -1.691845844583909], [-79.43397178076256, -1.691851284533779], 
    [-79.43395283944169, -1.692053292637794], [-79.43395281911414, -1.692054736321033], [-79.43395535750368, -1.692093535418117], 
    [-79.43390444734398, -1.69223087834723], [-79.43390428016939, -1.692231372437897], [-79.43374523144152, -1.692750043925838], 
    [-79.4340256570161, -1.692750271834557], [-79.43402638260521, -1.69184588855758], [-79.43381375958064, -1.691845715849684], 
    [-79.43312765678151, -1.691845158387183], [-79.4331269307764, -1.692749541273626], [-79.43354270912953, -1.692749879305633], 
    [-79.43364983051107, -1.692588468489809], [-79.4336510738479, -1.692585646334773], [-79.43371548446397, -1.692327269168548], 
    [-79.43380554258165, -1.692094789340216], [-79.43380615195998, -1.692091785860122], [-79.43381375958064, -1.691845715849684]]
    
    >>> a = [item for sublist in a for subsublist in sublist for item in subsublist]
    >>> a == desired
    True
    

    但是,正如 falsetru 所指出的,您的示例中有一个空的嵌套级别,在这种情况下,可以很好地清理解决方案 as they have shown

    【讨论】:

      【解决方案4】:

      你可以试试:

      [z for x in a for y in x for z in y]
      

      为了证明这一点:

      len([y for x in a for y in x]) == 21
      

      您可以使用pprint 正确查看:

      pprint.pprint(a)
      

      输出:

      [[[[-79.43402638260521, -1.69184588855758],
         [-79.4339722432865, -1.691845844583909],
         [-79.43397178076256, -1.691851284533779],
         [-79.43395283944169, -1.692053292637794],
         [-79.43395281911414, -1.692054736321033],
         [-79.43395535750368, -1.692093535418117],
         [-79.43390444734398, -1.69223087834723],
         [-79.43390428016939, -1.692231372437897],
         [-79.43374523144152, -1.692750043925838],
         [-79.4340256570161, -1.692750271834557],
         [-79.43402638260521, -1.69184588855758]]],
       [[[-79.43381375958064, -1.691845715849684],
         [-79.43312765678151, -1.691845158387183],
         [-79.4331269307764, -1.692749541273626],
         [-79.43354270912953, -1.692749879305633],
         [-79.43364983051107, -1.692588468489809],
         [-79.4336510738479, -1.692585646334773],
         [-79.43371548446397, -1.692327269168548],
         [-79.43380554258165, -1.692094789340216],
         [-79.43380615195998, -1.692091785860122],
         [-79.43381375958064, -1.691845715849684]]]]
      
      pprint.pprint([z for x in a for y in x for z in y])
      

      输出:

      [[-79.43402638260521, -1.69184588855758],
       [-79.4339722432865, -1.691845844583909],
       [-79.43397178076256, -1.691851284533779],
       [-79.43395283944169, -1.692053292637794],
       [-79.43395281911414, -1.692054736321033],
       [-79.43395535750368, -1.692093535418117],
       [-79.43390444734398, -1.69223087834723],
       [-79.43390428016939, -1.692231372437897],
       [-79.43374523144152, -1.692750043925838],
       [-79.4340256570161, -1.692750271834557],
       [-79.43402638260521, -1.69184588855758],
       [-79.43381375958064, -1.691845715849684],
       [-79.43312765678151, -1.691845158387183],
       [-79.4331269307764, -1.692749541273626],
       [-79.43354270912953, -1.692749879305633],
       [-79.43364983051107, -1.692588468489809],
       [-79.4336510738479, -1.692585646334773],
       [-79.43371548446397, -1.692327269168548],
       [-79.43380554258165, -1.692094789340216],
       [-79.43380615195998, -1.692091785860122],
       [-79.43381375958064, -1.691845715849684]]
      

      【讨论】:

        【解决方案5】:

        您需要遍历嵌套列表并加入它们。

        一个简单的方法:

        def flatten1(list_of_lists):
          "Flattens one level of lists."
          result = []
          for sub_list in list_of_lists:
            result.extend(sub_list)
          return result
        

        一个聪明的方法,利用你可以添加列表的事实:

        flatten1 = lambda(list_of_lists): sum(list_of_lists, [])
        

        现在,你可以a[0] = flatten1(a[0])

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-11
          • 2020-03-04
          • 2018-11-12
          • 1970-01-01
          • 1970-01-01
          • 2018-08-10
          相关资源
          最近更新 更多