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
相关产品推荐
相关产品推荐

