Как превратить список диктов в детерминированный порядок c? - PullRequest
1 голос
/ 19 февраля 2020

У меня есть произвольная (JSON -serializeable) структура, которая содержит списки dicts, о которых я ничего не знаю заранее (egsize или keys).

Есть ли способ привести этот список dicts в определенном порядке c (для их сравнения)?

Я мог бы подумать о том, чтобы превратить список диктов в список из двух кортежей, которые я могу сравнивать, но я ' ищу решение 'pythoni c' ..

Обратите внимание: я не хочу отсортировать список диктов по любому ключу, который я должен знать заранее, но я хочу отсортировать generi c (JSON -serializeable) списки диктов.

Еще одно примечание: я не просто хочу сравнивать дикты, но хочу иметь возможность сериализовать их. Поэтому я ищу функцию reorder, которая обеспечивает

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

1 Ответ

0 голосов
/ 20 февраля 2020
Функция

A 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...