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