itertools
适用于可迭代对象的基于true的解决方案:
>>> 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]})