每個人。我最近從Python 2切換到3.5.1,並且有一個斷言函數,我不能重寫。如何斷言沒有訂單的字典的兩個列表?
def assertEqualUnordered(self, data1, data2):
"""
compare that data are similar
i.e.:
[d1, d2] == [d2, d1]
or
{'a': [d1, d2]} == {'a': [d2, d1]}
or
[{'a': [d1, d2]}, {'b': [d3, d4]}] == [{'b': [d4, d3]}, {'a': [d2, d1]}]
"""
if isinstance(data1, list) or isinstance(data1, tuple):
self.assertEqual(len(data1), len(data2))
for d1, d2 in zip(sorted(data1), sorted(data2)):
self.assertEqualUnordered(d1, d2)
elif isinstance(data1, dict):
data1_keys = sorted(data1.keys())
data2_keys = sorted(data2.keys())
self.assertListEqual(data1_keys, data2_keys)
for key in data1_keys:
self.assertEqualUnordered(data1[key], data2[key])
else:
self.assertEqual(data1, data2)
一般這種代碼工作正常,但如果D1和D2類型的字典,比我有:
TypeError: unorderable types: dict() < dict()
我怎樣才能把它改寫在py3k工作?
編輯1: 簡化代碼示例:
def assertEqualUnordered(data1, data2):
assert len(data1) == len(data2)
for d1, d2 in zip(sorted(data1), sorted(data2)):
assert d1 == d2
data1 = [{'a': 'a'}, {'b': 'b'}]
data2 = [{'b': 'b'}, {'a': 'a'}]
assertEqualUnordered(data1, data2)
您是否可以簡化這一步,以便更仔細地瞭解您遇到的故障?我認爲這與key()返回視圖而不是列表有關。 https://docs.python.org/3.0/whatsnew/3.0.html 此外,你可以包括完整的堆棧跟蹤? – jgritty
顯示引發異常的代碼:此代碼不在任何地方使用'<'。 –
@jgritty簡化代碼示例 – vanadium23