真正itertools
爲基礎的解決方案,在一個迭代的工作原理:
>>> part_iter = iter(part_list)
>>> part_in, part_out = itertools.tee(part_iter)
>>> in_main = (p for p in part_in if p in main_list)
>>> out_main = (p for p in part_out if p not in main_list)
使羅列出這些失敗的使用迭代器的點,但這裏是結果:
>>> list(in_main)
[4, 1]
>>> list(out_main)
[5, 2, 7]
這具有從另一個懶惰生成的序列中懶惰地生成in_main
和out_main
的優點。唯一的問題是,如果你先迭代一個,那麼tee
必須緩存一堆數據,直到它被其他迭代器使用。所以這隻有在大致同時迭代它們時纔有用。否則,你可能會自己使用輔助存儲。
還有一個有趣的基於三元運算符的解決方案。 (你可以把它壓縮到一個列表理解中,但這是錯誤的。)我將main_list改爲O(1)查找的集合。
>>> main_set = set(main_list)
>>> in_main = []
>>> out_main = []
>>> for p in part_list:
... (in_main if p in main_set else out_main).append(p)
...
>>> in_main
[4, 1]
>>> out_main
[5, 2, 7]
還有一個有趣的collections.defaultdict
方法:
>>> import collections
>>> in_out = collections.defaultdict(list)
>>> for p in part_list:
... in_out[p in main_list].append(p)
...
>>> in_out
defaultdict(<type 'list'>, {False: [5, 2, 7], True: [4, 1]})
我覺得這可以用集合來完成 – 2012-04-12 13:48:25
@JakobBowyer main_list值可以從字典中生成。集合是顯而易見的解決方案,但尋找一個列表理解或itertools類型的解決方案,同時生成兩個列表。 – 2012-04-12 14:02:59