【问题标题】:Decompose list of lists into single list with non-iterable list elements将列表列表分解为具有不可迭代列表元素的单个列表
【发布时间】:2011-06-27 20:38:16
【问题描述】:

参考: python decompose a list Flattening a shallow list in Python

虽然上述解决方案很有帮助,但我的问题略有不同,我想知道是否有 python 的方法来解决它。

a = [['a-3','b-3'],'r',['j']]

我想要的是一种使“a”等于以下内容的简洁方法:

a = ['a-3','b-3','r','j']

我一直在使用 python 2.4,所以兼容 2.4 的 pythonic 解决方案会很棒,但我仍然会发现 2.7+ 的示例也很有趣。

主要问题是存在不可迭代的元素,否则 sum(lst,[]) 效果很好,就像 2.7+ 的 chain 方法一样

【问题讨论】:

    标签: python


    【解决方案1】:
    def flatten(L):
        if not L:
            return L
        elif isinstance(L[0], list):
            return flatten(L[0]) + flatten(L[1:])
        else:
            return [L[0]] + flatten(L[1:])
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      Pythonic 解决方案可能意味着很多事情。考虑到readability counts(PEP 20),这是我对线程的贡献:

      def dec(input_, output_):
          if type(input_) is list:
              for subitem in input_:
                  dec(subitem, output_)
          else:
              output_.append(input_)
      

      例子:

      input_ = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
      output_ = ['a-3', 'b-3', 'x', 'hello', '3', 'b', 'r', 'j']
      

      【讨论】:

        【解决方案3】:

        怎么样:

        itertools.chain.from_iterable(map(lambda i: i if type(i) == list else [i], a))
        

        或者,为了可读性:

        def assure_is_list(a):
           return a if type(a) == list else [a]
        
        itertools.chain.from_iterable(map(assure_is_list, a))
        

        【讨论】:

        • 同意,这是可行的,这适用于 itertools 可用之前的版本 .. sum(map(lambda i: i if type(i) == list else [i],a),[] ) .. 虽然我不确定 sum 是否打算用作列表分解器 .. 我希望避免使用条件,因为它们让事情看起来有点混乱。 sum(map(list,a),[]) .. 我很惊讶 str() 和其他一些人可以接受参数但 list 不能
        • 我认为这表明了对语言的良好了解,但并不是真正的 Python 公式(可读性很重要,请参阅我自己的答案)。干杯! :)
        • @mac:嗯,偏好很难讨论。你喜欢你的方式,我更喜欢我的方式:) 如果你为lambda 创建一个函数,用一个好听的名字,比如assure_is_list,它变得非常可读。
        • 此外,我认为这种解决方案不太容易出错。
        • @rafalotufo - 如果你给 lambda 函数起一个好听的名字,那么你的单行将违反 PEP 8! ;) [当然是在开玩笑……您的答案是完全正确的,而且 - 最重要的是 - 被 OP 选为首选答案。我简直无法抗拒! ;) ]
        【解决方案4】:

        任何可迭代类型的递归展平,除了单独保留字符串(因为您可能不想将它们拆分为字符):

        def flatten(x):
          try:
            if isinstance(x, basestring): raise TypeError
            y = iter(x)
          except TypeError:
            yield x
            return
          for item in y:
            for subitem in flatten(item):
              yield subitem
        

        【讨论】:

          【解决方案5】:

          认为你也可以使用这样的东西:

          data = [['a-3','b-3', ['x','hello', ['3','b']]],'r',['j']]
          
          while not all(not isinstance(x, list) for x in data):
              for i in xrange(len(data)):
                  value = data.pop(i)
                  if isinstance(value, list):
                      data.extend(value)    
                  else:
                      data.append(value)
          

          【讨论】:

            猜你喜欢
            • 2010-11-29
            • 1970-01-01
            • 2012-11-21
            • 2016-12-04
            • 2018-02-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多