Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较一本字典中有更多值的两本字典_Python_Python 3.x_List_Dictionary - Fatal编程技术网

Python 比较一本字典中有更多值的两本字典

Python 比较一本字典中有更多值的两本字典,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我只有一个问题,如果我的字典中有一个比另一个更有价值,我还能比较这两个字典还是我必须更改代码?例如: 我的代码: for key in result: if result[key]!=result2[key]: print("%s not equal"% (key)) 输出: result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4} result2={"jazi": 3, "juge": 4, "juha": 1

我只有一个问题,如果我的字典中有一个比另一个更有价值,我还能比较这两个字典还是我必须更改代码?例如:

我的代码:

for key in result:
     if result[key]!=result2[key]:
            print("%s not equal"% (key))
输出:


result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}

这是一种使用dict.get的方法

例:

输出:


这是一种使用dict.get的方法

例:

输出:


可以,但不能使用dict['key']和dict.get'key'。下面的代码不会给出任何数量的键的错误

for key in result:
    if result.get(key, "")!= result2.get(key, ""):
        print("%s not equal"% (key))

可以,但不能使用dict['key']和dict.get'key'。下面的代码不会给出任何数量的键的错误

for key in result:
    if result.get(key, "")!= result2.get(key, ""):
        print("%s not equal"% (key))

您的两个词典也可以有不同的键。因此,您需要迭代两个字典中的键组合。为此,您可以使用set从两个字典中获取唯一键列表,如下所示:

>>> dict1 = {'a': 1, 'b': 2, 'd': 4}
>>> dict2 = {'a': 3, 'c': 3, 'd': 4}

>>> my_keys = set(dict1.keys() + dict2.keys()) # To get unique keys from both dicts

>>> my_keys
set(['a', 'c', 'b', 'd'])
现在,为了从dict获取项,请使用dict.getkey而不是dict[key]。如果在字典中找不到键,dict[key]将引发KeyError异常。而dict.getget不返回任何值

因此,迭代字典的代码应该如下所示:

for key in my_keys:
    if dict1.get(key) != dict2.get(key):
        print("{} is having different value".format(key))

# which will print:
#     a is having different value
#     c is having different value
#     b is having different value

注意:由于dict.get在找不到键的情况下返回None,因此如果某个键不在一个dict中,并且同一个键在另一个dict中的值为None,则上述代码将不会返回正确的结果。在这种情况下,您应该使用默认值为dict.getkey的dict.get,其中默认值应该是value/string,它永远不会作为值出现在您的dict中,您的两个字典也可以有不同的键。因此,您需要迭代两个字典中的键组合。为此,您可以使用set从两个字典中获取唯一键列表,如下所示:

>>> dict1 = {'a': 1, 'b': 2, 'd': 4}
>>> dict2 = {'a': 3, 'c': 3, 'd': 4}

>>> my_keys = set(dict1.keys() + dict2.keys()) # To get unique keys from both dicts

>>> my_keys
set(['a', 'c', 'b', 'd'])
现在,为了从dict获取项,请使用dict.getkey而不是dict[key]。如果在字典中找不到键,dict[key]将引发KeyError异常。而dict.getget不返回任何值

因此,迭代字典的代码应该如下所示:

for key in my_keys:
    if dict1.get(key) != dict2.get(key):
        print("{} is having different value".format(key))

# which will print:
#     a is having different value
#     c is having different value
#     b is having different value
注意:由于dict.get在找不到键的情况下返回None,因此如果某个键不在一个dict中,并且同一个键在另一个dict中的值为None,则上述代码将不会返回正确的结果。在这种情况下,您应该使用默认值为dict.getkey的dict.get,默认值,其中默认值应该是value/string,在您的dict中永远不会以值的形式出现。

按照其他人的建议使用get是最简单的解决方案,但如果您想要,您可以更具体地说,而不仅仅是说不相等:

result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}

print("Only in result:", ", ".join(set(result).difference(result2)))
print("Only in result2:", ", ".join(set(result2).difference(result)))

for key in set(result).intersection(result2):
     if result[key]!=result2[key]:
            print("%s not equal"% (key))
给出:

Only in result: 
Only in result2: aba, meze
juha not equal
jazi not equal
juge not equal
或者更清楚一点:

keys, keys2 = set(result), set(result2)
print("Only in result:", ", ".join(keys - keys2))
print("Only in result2:", ", ".join(keys2 - keys))

for key in keys & keys2:
     if result[key]!=result2[key]:
            print("%s not equal"% (key))
这是完全相同的,但预先计算了集合,因此可以使用内联运算符-for.difference和&for.intersection

或者,如果您只是想要“不平等”信息:

keys, keys2 = set(result), set(result2)

for key in (keys ^ keys2) | {
        key for key in keys & keys2 if result[key] != result2[key] }:
    print("%s not equal"% (key))
按照其他人的建议使用get是最简单的解决方案,但如果您愿意,您可以更具体地说,而不仅仅是说不相等:

result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}

print("Only in result:", ", ".join(set(result).difference(result2)))
print("Only in result2:", ", ".join(set(result2).difference(result)))

for key in set(result).intersection(result2):
     if result[key]!=result2[key]:
            print("%s not equal"% (key))
给出:

Only in result: 
Only in result2: aba, meze
juha not equal
jazi not equal
juge not equal
或者更清楚一点:

keys, keys2 = set(result), set(result2)
print("Only in result:", ", ".join(keys - keys2))
print("Only in result2:", ", ".join(keys2 - keys))

for key in keys & keys2:
     if result[key]!=result2[key]:
            print("%s not equal"% (key))
这是完全相同的,但预先计算了集合,因此可以使用内联运算符-for.difference和&for.intersection

或者,如果您只是想要“不平等”信息:

keys, keys2 = set(result), set(result2)

for key in (keys ^ keys2) | {
        key for key in keys & keys2 if result[key] != result2[key] }:
    print("%s not equal"% (key))

如果没有嵌套的dict,set方法可能会带来一些东西,请参阅以获取更多信息

result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}

set_1 = set((k, v) for k, v in result.items())
set_2 = set((k, v) for k, v in result2.items())

print(f"not equals: {sorted(list(set1 ^ set2))}")
# not equals: [('aba', 7), ('jazi', 1), ('jazi', 3), ('juge', 1), ('juge', 4), ('juha', 1), ('juha', 9), ('meze', 9)]
print(f"only in first: {sorted(list(set_1 - set_2))}")
# only in first: [('jazi', 1), ('juge', 1), ('juha', 9)]
print(f"only in second: {sorted(list(set_2 - set_1))}")
# only in second: [('aba', 7), ('jazi', 3), ('juge', 4), ('juha', 1), ('meze', 9)]



如果没有嵌套的dict,set方法可能会带来一些东西,请参阅以获取更多信息

result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}

set_1 = set((k, v) for k, v in result.items())
set_2 = set((k, v) for k, v in result2.items())

print(f"not equals: {sorted(list(set1 ^ set2))}")
# not equals: [('aba', 7), ('jazi', 1), ('jazi', 3), ('juge', 1), ('juge', 4), ('juha', 1), ('juha', 9), ('meze', 9)]
print(f"only in first: {sorted(list(set_1 - set_2))}")
# only in first: [('jazi', 1), ('juge', 1), ('juha', 9)]
print(f"only in second: {sorted(list(set_2 - set_1))}")
# only in second: [('aba', 7), ('jazi', 3), ('juge', 4), ('juha', 1), ('meze', 9)]



在这种情况下,您将错过aba和meze键,但如果分配result和result2是另一种方式,您的代码将导致KeyError,因为上述键不在第二个字典中。因此,必须使用其他数据结构(如dict、list或元组)存储值。e、 g:{jazi:[1,3],juge:2,4}这看起来像XY问题。你的目标到底是什么?您可以使用set操作来比较键。在这种情况下,您将错过aba和meze键,但是,如果分配result和result2是另一种方式,那么您的代码将导致键错误,因为上述键不在第二个字典中,因此必须使用其他数据结构(如dict、list或tuple)存储该值。e、 g:{jazi:[1,3],juge:2,4}这看起来像XY问题。你的目标到底是什么?您可以使用集合操作来比较键。如果值不可散列,则将值放入集合中可能会有问题。但是如果值可散列。。。天哪,你用套装能省下多少钱!哦,事实上,这就是为什么我也发布了一个基于集合的答案。这完全取决于OP到底想要什么。如果值不可散列,则将值放入集合可能是一个问题。但是如果它们是。。。天哪,你用套装能省下多少钱!哦,事实上,这就是为什么我也发布了一个基于集合的答案。这完全取决于OP到底想要什么。