列表理解问题

Fal*_*rri 5 python list-comprehension

有没有办法在每次迭代的列表推导中将多个项添加到列表中?例如:

y = ['a', 'b', 'c', 'd']
x = [1,2,3]

return [x, a for a in y]
Run Code Online (Sandbox Code Playgroud)

输出: [[1,2,3], 'a', [1,2,3], 'b', [1,2,3], 'c', [1,2,3], 'd']

Sin*_*ion 6

确定有,但没有简单的列表理解:

编辑:灵感来自另一个答案:

y = ['a', 'b', 'c', 'd']
x = [1,2,3]

return sum([[x, a] for a in y],[])
Run Code Online (Sandbox Code Playgroud)

它是如何工作的:总和将添加一系列任何事物,只要有一个__add__成员来完成工作.但是,它以初始总数0开始.您不能将0添加到列表中,但您可以给出sum()另一个起始值.这里我们使用一个空列表.

如果不是需要一个实际的列表,而只需要一个生成器,那么你可以使用它itertools.chain.from_iterable,它只是将一堆迭代器串入一个长迭代器.

from itertools import *

return chain.from_iterable((x,a) for a in y)
Run Code Online (Sandbox Code Playgroud)

或者更友好的itertools:

return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y))
Run Code Online (Sandbox Code Playgroud)

当然还有其他方法:首先,我们可以通过消除不需要的lambda表达式来改进Adam Rosenfield的答案:

return reduce(list.__add__,([x, a] for a in y))
Run Code Online (Sandbox Code Playgroud)

因为list已经有一个完全符合我们要求的成员.我们可以在以下方面实现相同的使用map和副作用list.extend:

l = []
map(l.extend,[[x, a] for a in y])
return l
Run Code Online (Sandbox Code Playgroud)

最后,让我们去寻找尽可能不优雅的纯列表理解:

return [ y[i/2] if i%2 else x for i in range(len(y)*2)]
Run Code Online (Sandbox Code Playgroud)