有沒有辦法在每次迭代的列表理解中將多個項目添加到列表中?例如:列表理解問題
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']
有沒有辦法在每次迭代的列表理解中將多個項目添加到列表中?例如:列表理解問題
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']
肯定有,但不是一個簡單的列表理解:
編輯:由另一個答案的啓發:
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)]
這裏有一種方法:
y = ['a', 'b', 'c', 'd']
x = [1,2,3]
return reduce(lambda a,b:a+b, [[x,a] for a in y])
x = [1,2,3]
y = ['a', 'b', 'c', 'd']
z = []
[z.extend([x, a]) for a in y]
(正確的值將在z中)
嗯,我喜歡你的早期版本,它看起來更乾淨。這看起來不太可讀 – Falmarri 2010-11-27 02:04:38
。 。 。 'chain.from_iterable'在Python 2.6+中可用 – mshsayem 2010-11-27 05:41:50