如何将多个返回的列表合并为一个

时间:2014-08-26 01:04:42

标签: python

以下代码导致列表列表:[[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

4 个答案:

答案 0 :(得分:7)

使用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]

答案 1 :(得分:2)

我建议您使用itertools

中的chain

但是,您的函数应该返回一个空列表而不是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

答案 2 :(得分:1)

如果您真的想要使用列表理解,请尝试以下方法:

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

答案 3 :(得分:1)

你也可以使用列表组合扁平化:

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