如何比较python中的两个字典与列表,字符串和整数?

时间:2018-04-19 18:11:05

标签: python

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:列表对象不可用

我正在使用以下比较,因此打印语句中显示了不匹配的键:值对(如果有)。

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

3 个答案:

答案 0 :(得分:0)

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

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'}

答案 1 :(得分:0)

你可以利用difflib找到差异。

  1. 将dict转换为字符串
  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'}
    ?   
    

答案 2 :(得分:0)

您收到此错误是因为当您调用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]))

你无法获得像这样简单的解决方案。