python-嵌套循环和if条件的筛选函数
我有两个输入python-嵌套循环和if条件的筛选函数,python,Python,我有两个输入 list1 = [1,2,3,4,5,6] dict1={'a':[1,11],'b':[2,234],'c':[34,6]} 我需要将结果显示为 list1 = [3,4,5] 算法:显示列表1中不在dict1值中的值 我知道这可以通过下面的代码实现 tmp=0 for x in list1: for k,v in dict1.items(): if x in v: tmp=1 break;
list1 = [1,2,3,4,5,6]
dict1={'a':[1,11],'b':[2,234],'c':[34,6]}
我需要将结果显示为
list1 = [3,4,5]
算法:显示列表1中不在dict1值中的值
我知道这可以通过下面的代码实现
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
是否可以使用筛选函数或任何单行函数尝试此操作?将字典中的所有列表值收集到一个集合中:
all_values = {v for lst in dict1.itervalues() for v in lst}
然后根据以下内容筛选您的列表:
list1 = [v for v in list1 if v not in all_values]
演示:
您的解决方案不起作用,您正在迭代
dict1.values()
,而我认为您想要的是dict1.items()
。这条线实际上应该是:
for v in dict1.values():
或
虽然您实际上不需要k
,但我还是选择第一个选项
我会做的可能更像:
removeMe = []
for v in dict1.values():
removeMe.extend(v)
return [i for i in list1 if i not in removeMe]
输出
[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)
你能用文字解释一下你想要实现什么算法吗?你确定代码有效吗?@Manishearth:删除
list1
中的所有条目,这些条目也在dict1
@MartijnPieters的列表值中哦,哇,我应该想到的是:PHands down。想不出比这更好的了:'(为什么只使用dict.items()
忽略键?dict.values有什么问题吗?事实上,@Martijn-Peters'的答案比我的好。一套更快。
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)