如何使用列表理解在python中扩展列表?

问题描述:

我不是在Python经验丰富,我经常写代码(简体)看起来是这样的:如何使用列表理解在python中扩展列表?

accumulationList = [] 
for x in originalList: 
    y = doSomething(x) 
    accumulationList.append(y) 
return accumulationList 

然后我测试通过后,我重构为

return [doSomething(x) for x in originalList] 

但是,假如事实证明出了一点不同,我的循环看起来像这样:

accumulationList = [] 
for x in originalList: 
    y = doSomething(x) 
    accumulationList.extend(y) 
return accumulationList 

其中doSomething列表返回一个列表。什么是最完美的Pythonic方法?显然,以前的列表理解会列出一个列表。

更简单,更清洁与列表理解:

[y for x in originalList for y in doSomething(x)] 
+1

很大的改进!当我回答问题时,我不会使用嵌套列表理解。 – 2017-06-08 13:52:49

你的意思是这样的吗?

accumulationList = [] 
for x in originalList: 
    accumulationList.extend(doSomething(x)) 
return accumulationList 

或较短码(但不是最优的):

return sum((doSomething(x) for x in originalList), []) 

或相同的:

return sum(map(doSomething, originalList), []) 

由于@eyquem的提示(如果使用Python 2.x的):

import itertools as it 

return sum(it.imap(doSomething, originalList), []) 
+1

''收益总和(图(DoSomething的,originalList))[])''有** IMAP更好* *如果Python 2.右键如果Python 3 – eyquem 2011-05-10 08:28:43

Python的就地添加运算符(+=iaddoperator模块)相当于.extend的列表。将它与reduce配对即可得到你想要的。

import operator 

reduce(operator.iadd, (doSomething(x) for x in originalList) 
, accumulation_list) 

我不认为这种情况下有特殊的语法。但是你可以做的for循环更短:

accumulationList += doSomething(x) 

如果你坚持,你可以使用函数式编程压扁名单:

result = reduce(lambda a,b: a+b, [[i,i*2] for i in range(3)]) 

但我不会把这个Python的,我认为这是困难阅读比for循环。

我认为涉及add或iadd的答案在二次时间运行,这可能不是很好。我想尝试:

from itertools import chain 
accumulation_list = list(chain.from_iterable(doSomething(x) for x in originalList))