在Python中检查未排序的字典列表是否相等

5
我想确保两个未排序的字典列表相等,即它们具有相同的内容,尽管顺序可能不同。
使用in检查是不够的,因为重复的字典是可能存在的。(例如list1 = [dict1, dict1, dict2]list2 = [dict1, dict2, dict2]
如果是列表的列表,我只需要对它们进行排序:sorted(list_of_lists1) == sorted(list_of_lists2) 但是,对字典进行排序是不稳定的。
我可以通过将所有字典转换为元组来解决这个问题,但这似乎效率低下,不好。
是否有更直接的解决方案?
2个回答

7

我认为你不需要对任何东西进行哈希 - 你可以将每个字典更改为键值对元组的排序列表,然后对其进行排序。

def dict_list_eq(l1, l2):
    sorted_l1 = sorted(sorted(d.items()) for d in l1)
    sorted_l2 = sorted(sorted(d.items()) for d in l2)
    return sorted_l1 == sorted_l2

l1 = [{1: 2}, {3: 4}]
l2 = [{3: 4}, {1: 2}]
l3 = [{1: 209}, {3: 4}]

print(dict_list_eq(l1, l2))
print(dict_list_eq(l1, l3))

输出结果如预期:

True
False

这是我做的,但我真的以为有一种使用字典的方法来完成它。不过还是谢谢! - Mike B
我的直觉告诉我,如果你把它们保留为字典,就无法对它们进行排序,因此你必须将每个项目与其他项目进行比较,导致O(n^2)的运行时间,而这种方法使用(可能是)O(n)的列表/元组转换,一个O(n log(n))的排序,然后是一个O(n)的比较。 - Izaak van Dongen

0

如果您想确保每个列表中相同的对象出现相同的次数,可以依赖于字典的id(https://docs.python.org/3/library/functions.html#id),并进行您提到的排序:

if sorted(id(d) for d in list1) == sorted(id(d) for d in list2):
    ...

如果你正在寻找可能相等但不是同一个Python对象的字典,那么这个方法不适用。

在我的情况下,它们是相等的但不是同一个对象。 - Mike B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接