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)