如果你知道一個事實,即在您的序列中的項目進行排序,你可以只用生成器表達式:
(item for item in seq if item >= 5)
這將返回一個發電機;它實際上並沒有遍歷列表,直到你迭代它,即:
for item in (item for item in seq if item > 5)
print item
只會遍歷seq
一次。
使用生成器表達式像這樣幾乎是相同的使用itertools.ifilter
,其產生的發生器,在迭代列表僅返回符合過濾條件的值:
>>> import itertools
>>> seq = [1, 2, 3, 4, 5, 6, 7]
>>> list(itertools.ifilter(lambda x: x>=3, seq))
[3, 4, 5, 6, 7]
我不知道爲什麼(除了向後兼容性)我們現在需要itertools.ifilter
現在我們有發生器表達式,但itertools
中的其他方法是非常寶貴的。
例如,如果你不知道知道你的序列是排序的,而你仍然想從已知的項目開始返回序列中的所有內容,那麼你就不能使用生成器表達式。相反,請使用itertools.dropwhile
。這將產生一個發電機迭代列表跳過值,直到它找到一個符合過濾條件:
>>> seq = [1, 2, 4, 3, 5, 6, 7]
>>> list(itertools.dropwhile(lambda x: x != 3, seq))
[3, 5, 6, 7]
至於搜索向後推移,如果你正在使用的序列實際上是一個序列,這隻會工作(如列表,即有結束,可以向後導航),而不僅僅是任何可迭代的(例如返回下一個素數的生成器)。要做到這一點,使用reversed
功能,例如:
(item for item in reversed(seq) if item >= 5)
您使用的是有序字典,對不對? (普通的Python字典是無序的!) – user470379 2010-10-24 01:52:35
我認爲你最好給我們一個你想要做什麼的例子,以及字典是什麼(它將什麼映射到什麼?)以及你如何保證總是返回(? ?)從字典查找的關鍵字(什麼?),什麼是「關鍵字列表」,以及「拼接」是指「切片」還是別的。 – 2010-10-24 01:59:38