筛选字典中不在另一个字典中的值

时间:2019-11-01 15:57:05

标签: python dictionary filter

给出了两个字典mydict1mydict2。如果mydict2中已包含值,则mydict1中的键值对将被删除,而与键和值的顺序无关。

以下代码可提供正确的输出mydict2 = {'key6': [2,1,4], 'key4': [2]}。但是,它将用作较大代码的一部分。是否有一种更好的方法(即更具植物性)来编写它,以使其更紧凑,更有效而无需功能?

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}
mydict3 = {}

for md2 in mydict2:
    isindict = False
    for md1 in mydict1:
        isindict = isindict|(sorted(mydict1[md1])==sorted(mydict2[md2]))
    if not isindict:
        mydict3[md2] = mydict2[md2]
mydict2 = mydict3

removing items from a listcomparison of dictionariesconditional filtering of a dictionary的解决方案不能直接转让。

3 个答案:

答案 0 :(得分:1)

使用列表推导和字典推导对mydict2的所有值进行排序,然后检查mydict1的排序后的值是否在其中:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}

vals = [tuple(sorted(x)) for x in mydict1.values()]
mydict2 = {k:v for (k,v) in mydict2.items() if tuple(sorted(v)) not in vals}

print(mydict2)

或者,一行:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}

mydict2 = {k:v for (k,v) in mydict2.items() 
        if tuple(sorted(v)) not in [tuple(sorted(x)) for x in mydict1.values()]}

print(mydict2)

答案 1 :(得分:0)

您可以使用dict理解:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4]}

results = {key : value for (key,value) in mydict2.items() 
           if set(value) not in [ set(val) for val in mydict1.values()]}
print(results)
  

{'key4':[2],'key6':[2,1,4]}

Edit1

不能像这样重复:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3], 'key4' : [1, 1, 2]}
mydict2 = {'key4':[2],'key5':[2,1],'key6':[2,1,4], 'key7' : [2, 2, 1]}

编辑2

@Ruzihm awsers和@Peter Wood评论:

mydict3 = {k:v for (k,v) in mydict1.items() 
        if tuple(sorted(v)) not in set(tuple(sorted(x)) for x in mydict2.values())}

这会引起OP问题,避免像@Peter Wood所提到的那样在相同的元组中创建多个时间。

答案 2 :(得分:0)

我认为这会起作用:

mydict1 = {'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2 = {'key3':[2],'key5':[2,1],'key6':[2,1,4]}

def merge_two_dicts(x, y):
    z = x.copy()
    z.update(y) 
    return z

result = merge_two_dicts(mydict1, mydict2)
print(result)
相关问题