列表理解问题

时间:2010-11-27 01:42:02

标签: python list-comprehension

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

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

return [x, a for a in y]

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

3 个答案:

答案 0 :(得分:6)

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

编辑:受到另一个答案的启发:

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

return sum([[x, a] for a in y],[])

工作原理:只要有一个__add__成员来完成工作,sum就会添加一系列任意数据。但是,它的初始总数为0.您不能将0添加到列表中,但可以给sum()另一个起始值。这里我们使用一个空列表。

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

from itertools import *

return chain.from_iterable((x,a) for a in y)

或者更友好的itertools:

return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y))

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

return reduce(list.__add__,([x, a] for a in y))

因为列表已经有一个完全符合我们要求的成员。我们可以使用map中的list.extend和副作用来实现相同的效果:

l = []
map(l.extend,[[x, a] for a in y])
return l

最后,让我们选择一个尽可能不优雅的纯列表理解:

return [ y[i/2] if i%2 else x for i in range(len(y)*2)]

答案 1 :(得分:1)

这是一种方式:

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

return reduce(lambda a,b:a+b, [[x,a] for a in y])

答案 2 :(得分:1)

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

[z.extend([x, a]) for a in y]

(正确的值将在z中)