1 回答
TA贡献1802条经验 获得超5个赞
这是一种通常应该有效的解决方案,即使列表具有同一字典的倍数,并且一个列表中的字典可以具有公共键也是如此。这个想法是将字典转换为规范的、可散列的形式,然后使用Counter.
它确实假设字典键是可比较的并且字典值是可散列的,因此如果您的字典具有不可比较的键或不可散列的值,则它将不起作用。
from collections import Counter
def dict_to_canonical_hashable(d):
return tuple(sorted(d.items()))
def unordered_lists_equal(a, b):
canonical_a = Counter(map(dict_to_canonical_hashable, a))
canonical_b = Counter(map(dict_to_canonical_hashable, b))
return canonical_a == canonical_b
测试:
>>> unordered_lists_equal(dict_list_1, dict_list_2)
True
>>> unordered_lists_equal(dict_list_1, dict_list_3)
False
>>> unordered_lists_equal(dict_list_2, dict_list_3)
False
>>> unordered_lists_equal([{1: 2, 3: 4}, {5: 6}], [{1: 2}, {3: 4, 5: 6}])
False
>>> unordered_lists_equal([{1: 2}, {1: 3}], [{1: 3}, {1: 2}])
True
>>> unordered_lists_equal([{1: 2}, {1: 2}], [{1: 2}])
False
>>> unordered_lists_equal([{1: 2}, {1: 2}], [{1: 2}, {1: 2}])
True
添加回答
举报