Python 筛选字典中不在其他字典中的值

Python 筛选字典中不在其他字典中的值,python,dictionary,filter,Python,Dictionary,Filter,给出了两个字典mydict1和mydict2。如果值已包含在mydict1中,则应删除mydict2中的键值对,而不考虑键和值的顺序 下面的代码提供了正确的输出mydict2={'key6':[2,1,4],'key4':[2]}。但是,它将作为更大代码的一部分使用。是否有更好的方法,即更具植物性的方法来编写它,从而使它更紧凑、更有效,而不需要函数 mydict1={'key1':[1],'key2':[1,2],'key3':[1,2,3]} mydict2={'key4':[2],'key5

给出了两个字典
mydict1
mydict2
。如果值已包含在
mydict1
中,则应删除
mydict2
中的键值对,而不考虑键和值的顺序

下面的代码提供了正确的输出
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={}
对于mydict2中的md2:
IsIndicat=False
对于mydict1中的md1:
isindict=isindict |(已排序(mydict1[md1])==已排序(mydict2[md2]))
如果没有指示:
mydict3[md2]=mydict2[md2]
mydict2=mydict3

和的解决方案不可直接转让。

您可以使用dict理解:

mydict1={'key1':[1],'key2':[1,2],'key3':[1,2,3]}
mydict2={'key4':[2],'key5':[2,1],'key6':[2,1,4]}
结果={key:mydict2.items()中(key,value)的值
如果设置(值)不在[set(val)for val in mydict1.values()]中]
打印(结果)
{'key4':[2],'key6':[2,1,4]}

编辑1 不能像这样重复工作:

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 Awers和@Peter Wood的评论:

mydict3={k:v表示mydict1.items()中的(k,v)
如果元组(排序(v))不在集合中(mydict2.values()中x的元组(排序(x))}

这将解决OP问题,避免多次创建@Peter Wood提到的同一个值元组。

使用列表理解和dict理解对
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)

我认为这会奏效:

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)

如果
value
中的元素顺序不同怎么办?如果要记忆元组列表,则在
mydict1
@PeterWood中为每个键/值对创建相同的元组列表时失败,然后使用带有额外一行的版本
vals=…
@PeterWood我想我不确定你的意思,因为我的答案在第一个代码示例中只创建了一个元组列表,而不是每个键/值对的列表。