-1

我有两个输入

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

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

4

3 回答 3

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]
于 2013-11-07T10:36:59.773 回答
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]
于 2013-11-07T10:45:29.127 回答
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)
于 2013-11-07T10:46:41.930 回答