给出了两个字典mydict1
和mydict2
。如果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 list,comparison of dictionaries和conditional filtering of a dictionary的解决方案不能直接转让。
答案 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]}
不能像这样重复:
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]}
@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)