使用list comprehension,itertools或类似的函数,是否可以根据条件从列表中创建两个不相等的列表?这是一个例子:
main_list = [6, 3, 4, 0, 9, 1]
part_list = [4, 5, 1, 2, 7]
in_main = []
out_main = []
for p in part_list:
if p not in main_list:
out_main.append(p)
else:
in_main.append(p)
print out_main
print in_main
>>> [5, 2, 7]
>>> [4, 1]
尝试保持简单,但作为使用示例,main_list可以是包含字典键的part_list的字典中的值。需要同时生成两个列表。第h
答案 0 :(得分:6)
只要您没有重复数据&顺序无所谓。
main_set = set([6, 3, 4, 0, 9, 1])
part_set = set([4, 5, 1, 2, 7])
out_main = part_set - main_set
in_main = part_set & main_set
完成工作。
答案 1 :(得分:5)
如果订单(在part_list中)很重要:
out_main = [p for p in part_list if p not in main_list]
in_main = [p for p in part_list if p in main_list]
否则:
out_main = list(set(part_list) - set(main_list))
in_main = list(set(part_list) & set(main_list))
答案 2 :(得分:2)
基于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]})
答案 3 :(得分:0)
in_main = list(set(main_list) & set(part_list))
out_main = list(set(part_list) - set(in_main))
答案 4 :(得分:0)
从谓词列表开始:
test_func = [part_list.__contains__, lambda x: not part_list.__contains__(x)]
# Basically, each of the predicates is a function that returns a True/False value
# (or similar) according to a certain condition.
# Here, you wanted to test set intersection; but you could have more predicates.
print [filter(func, main_list) for func in test_func]
然后你有了#34; one-liner&#34;但是通过维护谓词列表来进行一些开销工作
正如其他答案所述,您可以使用set(main_list)
代替(当然不是列表理解,而是之前)。