2010-11-27 33 views
5

有沒有辦法在每次迭代的列表理解中將多個項目添加到列表中?例如:列表理解問題

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']

回答

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表達式提高亞當羅森菲爾德的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)] 
+0

嗯,我喜歡你的早期版本,它看起來更乾淨。這看起來不太可讀 – Falmarri 2010-11-27 02:04:38

+0

。 。 。 'chain.from_iterable'在Python 2.6+中可用 – mshsayem 2010-11-27 05:41:50

1

這裏有一種方法:

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

return reduce(lambda a,b:a+b, [[x,a] for a in y]) 
1
x = [1,2,3] 
y = ['a', 'b', 'c', 'd'] 
z = [] 

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

(正確的值將在z中)