【问题标题】:Flatten lists of variable depths in Python在 Python 中展平可变深度列表
【发布时间】:2017-11-09 17:23:23
【问题描述】:

我有一个包含 n 个列表的列表。每个内部列表包含 (a) 字符串、(b) 空列表或 (c) 包含一个字符串的列表的组合。我想转换内部列表,使它们只包含字符串。

例如,我有一个这样的列表:

[[[],["a"],"a"],[["ab"],[],"abc"]]

我希望它是这样的:

[["","a","a"],["ab","","abc"]]

我知道我可能会经历一个循环,但我正在寻找一个更优雅的解决方案,最好是列表理解。

【问题讨论】:

  • 最大深度是多少(需要递归)?

标签: python list list-comprehension


【解决方案1】:

列表理解:

>>> original = [[[],["a"],"a"],[["ab"],[],"abc"]]
>>> result = [['' if not item else ''.join(item) for item in sublist] for sublist in original]
>>> result
[['', 'a', 'a'], ['ab', '', 'abc']]

【讨论】:

    【解决方案2】:

    由于您想要展平的列表中的每个元素都是可迭代的,因此您实际上可以使用鸭子类型,而不是检查是否是某个类(列表、字符串)的实例:

    >> my_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
    >> [list(map(lambda x: ''.join(x), elem)) for elem in my_list]
    

    或更易读的版本:

    result = []
    for elem in my_list:
        flatten = map(lambda x: ''.join(x), elem)
        result.append(list(flatten))
    

    结果:

    [['', 'a', 'a'], ['ab', '', 'abc']]
    

    不去检查什么,而是利用转换机制来适应每个结构的适应能力,这很像蟒蛇。

    【讨论】:

      【解决方案3】:

      通过列表理解:

      lst = [[[],["a"],"a"],[["ab"],[],"abc"]]
      result = [ ['' if not v else (v[0] if isinstance(v, list) else v) for v in sub_l] 
                 for sub_l in lst ]
      
      print(result)
      

      输出:

      [['', 'a', 'a'], ['ab', '', 'abc']]
      

      【讨论】:

      • 这是正确的答案,但它非常人类不可读! (不是你的错罗马!)
      【解决方案4】:
       original_list = [[[],["a"],"a"],[["ab"],[],"abc"]]
       flatten = lambda x: "" if x == [] else x[0] if isinstance(x, list) else x
       flattened_list = [[flatten(i) for i in j] for j in original_list]
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      【解决方案5】:

      我不确定这是否是您想要的,但您可以尝试对原始列表中的每个列表使用递归解决方案。这是函数的代码。

      def flatten(aList):
          if aList == []:
              return [""]
          if type(aList[0]) is list:
              return flatten(aList[0])+flatten(aList[1:]) if len(aList)>1 else flatten(aList[0])
          return aList[:1]+flatten(aList[1:]) if len(aList)>1 else aList[:]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-25
        • 2013-11-13
        • 2021-12-18
        • 2012-01-18
        • 2021-07-01
        • 2011-01-25
        • 2013-02-16
        相关资源
        最近更新 更多