每个人。我最近从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