【问题标题】:How to compare two dictionaries in python with list, string and integer?python - 如何将python中的两个字典与列表、字符串和整数进行比较?
【发布时间】:2018-04-19 18:11:04
【问题描述】:
results = {}
expectedResults = {}

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

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

compare = dict(set(results.items())-set(expectedResults.items()))
print(str(compare))

我收到以下错误。 TypeError:列表对象不可散列

我正在使用以下比较,以便不匹配的 key: value 对(如果有)显示在打印语句中。

compare = dict(set(results.items())-set(expectedResults.items()))

【问题讨论】:

  • 您可以使用results == expectedResults 测试是否相等。您提供的示例不是很有趣。您可以将其修改为不匹配并显示所需的输出吗?

标签: python


【解决方案1】:

您收到此错误是因为当您调用 results.items() 时,它返回的列表不是可散列的。

让您的代码工作的一种简单方法是遍历每个 dict 项并检查其是否相等

for i in results:
if(results[i] !=  expectedResults[i]):
    print('different key : value pair')
    print('key : ' + i)
    print('Value in results : ' + str(results[i]))
    print('Value in expectedResults : ' + str(expectedResults[i]))

你无法得到这么简单的解决方案。

【讨论】:

  • 太棒了。谢谢。
  • 什么是预期的结果有一个结果没有的附加键?
【解决方案2】:

如果列表是字典中唯一不可散列的类型,您可以创建字典用于将列表转换为元组的比较:

results = {'a': 3, 'b': [1, 2], 'c': 'this is unmatched'}
expected_results = {'a': 3, 'b': [1, 2], 'c': 'blablabla'}

a_items = {k: tuple(v) if isinstance(v, list) else v for k, v in results.items()}
b_items = {k: tuple(v) if isinstance(v, list) else v for k, v in expected_results.items()}

compare = dict(set(a_items.items())-set(b_items.items()))
print(compare)

输出:

{'c': 'this is unmatched'}

【讨论】:

    【解决方案3】:

    您可以利用 difflib 来发现差异。

    1. 将字典转换为字符串
    2. 检查字符串之间的区别

      import difflib
      import pprint
      results = {}
      expectedResults = {}
      
      results['a'] = 3
      results['b'] = [1, 2]
      results['c'] = '2A 04 73 74'
      
      expectedResults['a'] = 3
      expectedResults['b'] = [1, 2]
      expectedResults['c'] = 'test'
      
      print '\n'.join(difflib.ndiff(pprint.pformat(results).splitlines(), pprint.pformat(expectedResults).splitlines()))
      

      输出:

      - {'a': 3, 'b': [1, 2], 'c': '2A 04 73 74'}
      ?                             ^^^^^^^^^^^
      
      + {'a': 3, 'b': [1, 2], 'c': 'test'}
      ?   
      

    【讨论】:

    • 字典不一定保证其输入的顺序。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多