如何将dicts列表转换为确定性顺序



我有一个任意的(JSON可序列化的(结构,它包含dicts的列表,我事先对此一无所知(例如大小或键(。

有没有办法将dicts的列表按确定性顺序排列(以便进行比较(?

我可以考虑把dicts列表变成2元组列表,我可以进行比较,但我正在寻找一个"蟒蛇式"的解决方案。。

请注意:我不想按任何我必须事先知道的键对dict列表进行排序,但我想对dict的通用列表进行排序。

另一个注意事项:我不只是想比较dict,而是希望能够序列化它们。所以我正在寻找一个函数reorder,它可以确保

json.dumps(reorder([{'a': 1}, {'b': 2}])) == json.dumps(reorder([{'b': 2}, {'a': 1}]))

问题中提到的reorder()函数可以这样实现:

def reorder(data):
def comparable(uncomparable):
if isinstance(uncomparable, dict):
return tuple((k, comparable(v)) for k, v in uncomparable.items())
if isinstance(uncomparable, (list, tuple)):
return tuple(comparable(d) for d in uncomparable)
return data
if isinstance(data, (list, tuple)):
return sorted([reorder(d) for d in data], key=lambda e: comparable(e))
if isinstance(data, dict):
return {k: reorder(v) for k, v in data.items()}
return data

请注意,此函数隐式地将tuple转换为list,这在序列化为JSON时会产生相同的结果。

最新更新