如何用列表推导法比较两个字典的值?



如何只比较两个字典的值?

这里是:

dict1 = {"appe": 3962.00, "waspeen": 3304.08}
dic2 = {"appel": 3962.00, "waspeen": 3304.08}

def compare_value_dict(dic):
return dic
def compare_value_dict2(dic2):   
return dic2

def compare_dic(dic1, dic2):
if dic1 == dic2:       
print('the same dictionary')
else:      
print('difference dictionary')
compare_dic(compare_value_dict(dict1).values(), compare_value_dict2(dic2.values()))

如此:

compare_dic(compare_value_dict(dict1).keys(), compare_value_dict2(dic2.keys()))

不能在dict.values()字典视图对象上使用==,因为该特定类型不像集合那样工作。相反,values_view_foo == values_view_bar只有在两者都引用相同的字典视图对象时才为真。内容不重要。

这完全取决于字典包含的值的类型,以及在这里可以使用什么技术。以下选项将涵盖许多不同类型的值,但不是全部。对于字典中所有可能类型的值,不可能创建一个通用的放之四海而皆准的比较函数。

在这个特殊的例子中,你可以把你的值视图变成集合,因为值恰好都是唯一的可哈希的:

def compare_dict_values(dv1, dv2):
"""Compare two dictionary values views
Values are assumed to be unique and hashable
"""
return set(dv1) == set(dv2)

如果值不是唯一的,和/或不可哈希,你必须找到另一种方法来比较值。

如果它们是可排序的(可排序的),那么您可以通过先对值排序来比较它们:

def compare_dict_values(dv1, dv2):
"""Compare two dictionary value views
Values are assumed to be orderable, but do not need to be unique
or hashable.
"""
return len(dv1) == len(dv2) and sorted(dv1) == sorted(dv2)

通过排序可以消除值视图无序的问题。len()检查在那里是因为它比排序便宜得多,所以让您在不必要的时候避免排序。

如果值是可哈希的,但不是唯一的(因此值集合('foo', 'bar', 'foo')('foo', 'bar', 'bar')不同),您可以使用Counter()对象来捕获值及其计数:

from collections import Counter
def compare_dict_values(dv1, dv2):
"""Compare two dictionary value views
Values are assumed to be hashable, but do not need to be unique.
"""
return Counter(dv1) == Counter(dv2)

注意这些技术都假设字典中的单个值支持相等性测试,并且您只需要它们完全相等。对于浮点值,您可能会遇到值几乎相等,但不完全相等的问题。如果您的值需要接近而不是完全相等,则可以对每对值使用math.isclose()函数。使用zip(sorted(dv1), sorted(dv2))对值进行配对:

def float_dict_values_close(dv1, dv2, **kwargs):
"""Compare two dictionary view objects with floats
Returns true if the values in both dictionary views are
*close* in value.
"""
if len(dv1) != len(dv2):
return False
v1, v2 = sorted(dv1), sorted(dv2)
return all(is_close(*vs, **kwargs) for vs in zip(v1, v2))

如果你的值可以是不同的类型,事情会变得更复杂;通常不能对混合了不同类型的字典值视图进行排序。如果您有一个混合类型,而不是所有类型都是可哈希的,那么您必须首先分离出不同的类型,然后使用混合技术来比较相同类型的值。当你有一个可以比较子类和超类等的类型层次结构时,这就变得复杂了。我声明这超出了这个答案的范围。

所以你要检查你的字典和它们的值是否相同?

dict1 = {"appe": 3962.00, "waspeen": 3304.08}
dic2 = {"appel": 3304.08, "waspeen": 3962.00}
def comparision(*dicts):
instanceToCompare , values = len(dicts[0].values()) , set()
for d in dicts:
for value in d.values():
values.add(value)
return True if len(values) == instanceToCompare else False
print('all dictionaries has same values') if comparision(dict1 , dic2) else 
print('input dictionaries are not same at all')

你会知道字典中的所有值是否相同,不管它们的顺序或重复

你可以使用函数dic.keys(),它返回一个包含所有"头标"的向量;从你的字典里。在for循环中,你可以比较。

最新更新