【问题标题】:How to merge multiple returned lists into one [duplicate]如何将多个返回的列表合并为一个[重复]
【发布时间】:2014-10-19 05:31:15
【问题描述】:

下面的代码生成列表列表:[[1, 2, 3], [4, 5, 6]] 如何修改它,结果是一个简单的列表:`[1,2,3,4,5,6]?

def functA():
    return [1,2,3]
def functB():
    return [4,5,6]
def functC():
    return None

functs=[functA, functB, functC]

result=[a for a in [funct() for funct in functs] if a]

print result

【问题讨论】:

  • 看看list.extend
  • 我想在列表理解中实现这一点。

标签: python


【解决方案1】:

您也可以使用列表组合进行展平:

result=[ x for y in (a for a in (funct() for funct in functs) if a) for x in y]

【讨论】:

    【解决方案2】:

    如果您真的想使用列表推导,试试这个:

    result= [item
             for sublist in [funct()
                             for funct in functs]
             if sublist is not None
             for item in sublist]
    

    【讨论】:

      【解决方案3】:

      我建议使用来自itertoolschain

      但是,您的函数应该返回一个空列表而不是 None,因为这对预期格式更友好。

      由于第一个列表是临时的,我将其设为生成器序列。

      from itertools import chain
      
      def functA():
          return [1,2,3]
      
      def functB():
          return [4,5,6]
      
      def functC():
          return [] # returns an empty list, in line with what is expected.
      
      functs=[functA, functB, functC]
      
      result = list(chain(*(a() for a in functs)))
      
      print result
      

      【讨论】:

        【解决方案4】:

        使用itertools.chain 方法:

        例如,这段代码:

        from itertools import chain
        print list(chain.from_iterable([[1, 2, 3], [4, 5, 6]]))
        

        将打印出来:

        [1, 2, 3, 4, 5, 6]
        

        在你的情况下,你可以使用:

        result = list(chain.from_iterable(a for a in [funct() for funct in functs] if a))
        

        result 将是:

        [1, 2, 3, 4, 5, 6]
        

        【讨论】:

        • list(chain(*[a for a in [funct() for funct in functs] if a])) 也可以使用
        猜你喜欢
        • 2018-03-11
        • 2018-04-10
        • 2012-05-12
        • 2021-06-02
        • 2020-11-26
        • 1970-01-01
        • 2020-07-19
        • 2012-07-19
        相关资源
        最近更新 更多