如何使用列表推导式比较两个字典取值?及仅比较字典取值方法
字典取值比较的问题解决
问题1:怎么用列表推导式比较两个字典的取值?
问题2:怎么只比较两个字典的取值?
先说说你现有代码的问题:
你调用compare_dic(compare_value_dict(dict1).values(), compare_value_dict2(dic2.values()))的时候,第二个参数传错了——compare_value_dict2要的是字典,但你传了dic2.values()(这是个取值视图对象)。另外那两个compare_value_dict函数完全没用,直接用dict1.values()和dic2.values()就行。
方法1:直接比取值视图(不关心值出现次数的情况)
Python 3里,字典的values()返回的视图对象可以直接比较,只要两个字典的取值集合(不管顺序)一样,就会返回True:
dict1 = {"appe": 3962.00, "waspeen": 3304.08} dic2 = {"appel": 3962.00, "waspeen": 3304.08} def compare_dic(dic_values1, dic_values2): if dic_values1 == dic_values2: print('取值相同') else: print('取值不同') compare_dic(dict1.values(), dic2.values())
这段代码会输出取值相同,符合你的需求。
方法2:用列表推导式比较(要关心值出现次数的情况)
如果需要严格对比每个值的出现次数(比如一个字典有两个1,另一个只有一个1,得区分开),可以用列表推导式把取值转成列表,再用collections.Counter统计次数:
from collections import Counter dict1 = {"a": 1, "b": 2, "c": 1} dic2 = {"x": 1, "y": 2, "z": 1} # 用列表推导式把取值转成列表 values1 = [v for v in dict1.values()] values2 = [v for v in dic2.values()] if Counter(values1) == Counter(values2): print('取值(包括出现次数)完全相同') else: print('取值不一样')
要是不想用Counter,也可以用列表推导式结合生成器来检查:
dict1 = {"appe": 3962.00, "waspeen": 3304.08} dic2 = {"appel": 3962.00, "waspeen": 3304.08} # 先检查dict1的每个值都在dic2里,再检查次数一致 all_values_match = all(v in dic2.values() for v in dict1.values()) counts_match = Counter(dict1.values()) == Counter(dic2.values()) if all_values_match and counts_match: print('取值相同') else: print('取值不同')
为啥你原来比keys的代码能跑?
因为dict1.keys()和dic2.keys()返回的是键视图对象,直接比较就是看两个键的集合是否相同。你传参的时候是compare_value_dict2(dic2.keys()),函数直接返回这个键视图,然后和dict1.keys()比较,所以能正常运行,但那两个函数真的没必要写,直接传dict1.keys()和dic2.keys()就行。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

