如何使用列表理解在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)]
你的意思是这样的吗?
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), [])
''收益总和(图(DoSomething的,originalList))[])''有** IMAP更好* *如果Python 2.右键如果Python 3 – eyquem 2011-05-10 08:28:43
Python的就地添加运算符(+=
,iadd
,operator
模块)相当于.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))
很大的改进!当我回答问题时,我不会使用嵌套列表理解。 – 2017-06-08 13:52:49