iterable で機能する trueitertools
ベースのソリューション:
>>> 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]})