You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用列表推导式比较两个字典取值?及仅比较字典取值方法

字典取值比较的问题解决

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:03:05