我想比较两个字典:
> x_state
[{'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'}, {'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'}, {'ID': 4, 'Name': 'D'}, {'ID': 5, 'Name': 'X'}]
> objects
[{'ID': 4, 'Name': 'D'}, {'ID': 5, 'Name': 'X'}, {'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'}, {'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'}]
为了更容易找到差异,我首先对它们进行排序,然后对其运行一些比较方法。由于SO上的大多数类似问题都会导致文件长度的差异或读取文件时的问题(x_state是来自文件的JSON),因此我决定计算它们:
unos=[sorted(l, key=itemgetter("ID"))for l in (x_state,objects)]
> unos
[[{'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'}, {'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'}, {'ID': 4, 'Name': 'D'}, {'ID': 5, 'Name': 'X'}],
[{'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'}, {'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'}, {'ID': 4, 'Name': 'D'}, {'ID': 5, 'Name': 'X'}]]
#Looks like nothing weird happened
> len(unos)
2
> len(unos[0])
4
> len(unos[1])
4
看起来很好,但从这一点来看,一切都失败了:
> for i,j in unos: print(f"{i}------{j}")
*** ValueError: too many values to unpack (expected 2)
> for i,j in zip(unos): print(f"{i}------{j}")
*** ValueError: not enough values to unpack (expected 2, got 1)
尝试其他操作,看看两者是否包含相同的数据:
> any(x != y for x, y in unos)
*** ValueError: too many values to unpack (expected 2)
这是怎么回事?我该如何正确地调试这个问题?
排序命令执行错误。正确的:
ipdb> !for x,y in zip(sorted(x_state, key=itemgetter("ID")),sorted(objects, key=itemgetter("ID"))): print(x,y)
{'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'} {'ID': 1, 'Wert': '6,6743', 'Name': 'Δ'}
{'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'} {'Wert': 'Δ', 'ID': 3, 'Name': 'Δ'}
{'ID': 4, 'Name': 'D'} {'ID': 4, 'Name': 'D'}
{'ID': 5, 'Name': 'X'} {'ID': 5, 'Name': 'X'}