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

Python中如何比较包含列表、字符串和整数的两个字典?

解决字典比较时的"list objects are unhashable"错误

你碰到的这个问题根源很明确:列表是不可哈希类型,而集合要求所有元素必须是可哈希的(比如整数、字符串、元组这类能被哈希的类型)。当你尝试把字典的items()转换成集合时,像('b', [1,2])这样的键值对元组里包含了列表,直接触发了TypeError。

要找出字典中不匹配的键值对,你可以用以下几种替代方案:

方案1:手动遍历键逐个比较

这是最直观的方法,因为字典的键本身是可哈希的,我们可以遍历所有键,逐一对比对应的值:

results = {
    'a': 3,
    'b': [1, 2],
    'c': '2A 04 73 74'
}
expectedResults = {
    'a': 3,
    'b': [1, 2],
    'c': '2A 04 73 74'
}

mismatches = {}

# 检查results中的键在expectedResults中的匹配情况
for key, val in results.items():
    expected_val = expectedResults.get(key)
    if val != expected_val:
        mismatches[key] = (val, expected_val)

# 补充检查expectedResults中存在但results没有的键
for key in expectedResults:
    if key not in results:
        mismatches[key] = (None, expectedResults[key])

print(mismatches)

这个方法能处理所有支持相等性比较的值类型(包括列表、嵌套字典等),还能覆盖"一方有键另一方没有"的场景。

方案2:用字典推导式简化代码

如果想让代码更简洁,可以先获取所有键的集合,再用推导式收集不匹配的项:

all_keys = set(results.keys()).union(expectedResults.keys())
mismatches = {
    key: (results.get(key), expectedResults.get(key))
    for key in all_keys
    if results.get(key) != expectedResults.get(key)
}

print(mismatches)

逻辑和方案1一致,但代码更紧凑,适合快速实现。

方案3:测试场景用unittest的断言方法

如果你是在写测试代码,Python标准库的unittest模块提供了assertDictEqual方法,它会自动递归比较字典的所有内容,还能给出详细的错误提示:

import unittest

results = {
    'a': 3,
    'b': [1, 2],
    'c': '2A 04 73 74'
}
expectedResults = {
    'a': 3,
    'b': [1, 2],
    'c': '2A 04 73 74'
}

try:
    unittest.TestCase().assertDictEqual(results, expectedResults)
    print("所有键值对完全匹配")
except AssertionError as e:
    print("发现不匹配:", str(e))

这个方法适合测试场景,能帮你快速定位不匹配的具体位置。


内容的提问来源于stack exchange,提问作者Udhay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:57