python - 嵌套循环和if条件的过滤器函数

时间:2013-11-07 10:32:43

标签: python

我有两个输入

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

无论如何我可以尝试使用过滤功能或任何单行功能吗?

3 个答案:

答案 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)