我有两个输入
list1 = [1,2,3,4,5,6]
dict1={'a':[1,11],'b':[2,234],'c':[34,6]}
我需要将结果显示为
list1 = [3,4,5]
算法:显示不在dict1值
中的list1的值我知道这可以通过以下代码来实现,
tmp=0
for x in list1:
for k,v in dict1.items():
if x in v:
tmp=1
break;
if tmp:
list1.remove(x)
tmp=''
print list1
无论如何我可以尝试使用过滤功能或任何单行功能吗?
答案 0 :(得分:1)
将字典中的所有列表值收集到一个集合中:
all_values = {v for lst in dict1.itervalues() for v in lst}
然后过滤您的列表:
list1 = [v for v in list1 if v not in all_values]
演示:
>>> list1 = [1,2,3,4,5,6]
>>> dict1={'a':[1,11],'b':[2,234],'c':[34,6]}
>>> all_values = {v for lst in dict1.itervalues() for v in lst}
>>> [v for v in list1 if v not in all_values]
[3, 4, 5]
答案 1 :(得分:0)
当我认为你想要的是dict1.values()
时,你的解决方案将不起作用,你正在迭代dict1.items()
。那条线应该是:
for v in dict1.values():
或
for k, v in dict1.items():
虽然你真的不需要k
,所以我会选择第一个选项。
我会做的更像是:
removeMe = []
for v in dict1.values():
removeMe.extend(v)
return [i for i in list1 if i not in removeMe]
答案 2 :(得分:0)
list1 = [1,2,3,4,5,6]
dict1 = {'a':[1,11],'b':[2,234],'c':[34,6]}
set1 = set(list1)
set2 = set(t for _, v in dict1.items() for t in v)
print list(set1 - set2)
<强>输出强>
[3, 4, 5]
编辑:根据布鲁诺的建议
list1 = [1,2,3,4,5,6]
dict1 = {'a':[1,11],'b':[2,234],'c':[34,6]}
from itertools import chain
set1 = set(list1)
set2 = set(v for v in chain.from_iterable(dict1.values()))
print list(set1 - set2)