Сортировка словаря по значению, где значение - это словарь - PullRequest
1 голос
/ 05 февраля 2020

Я ищу способ сортировки словаря по значениям. Но здесь есть подвох, мои значения - это тоже словари. Поэтому я хочу отсортировать по первому значению моего словаря значений.

Например, учитывая словарь:

x = {'a':{'b':1, 'c':2, 'd':3}, 'e':{'f':3, 'g':4, 'h':5}, 'i':{'j':2, 'k':3, 'l':4}}

Я бы хотел, чтобы словарь сортировался по значениям 'b', 'f' и 'j'. Сортированный словарь будет возвращаться как:

x = {'a':{'b':1, 'c':2, 'd':3}, 'i':{'j':2, 'k':3, 'l':4}, 'e':{'f':3, 'g':4, 'h':5}}

Любая помощь будет удивительной. Предпочтительно, я ищу решение, которое использует отсортированный метод вместе с лямбдами.

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

По умолчанию dict тип не упорядочен.
Использование collections.OrderedDict.
Сортировка OrderedDict вопрос

0 голосов
/ 05 февраля 2020

Используйте функцию sorted и предоставьте ей комбинацию next и iter в качестве ключа:

x = dict(sorted(x.items(), key=lambda y: next(iter(y))))

Это работает, превращая dict в итератор, а затем получает первый ключ из этого итератора, поскольку сортировка возвращает список, таким образом, являясь списком key, value, кортежи используют dict для отсортированного результата, чтобы получить dict в результате.

{'a': {'b': 1, 'c': 2, 'd': 3}, 'e': {'f': 3, 'g': 4, 'h': 5}, 'i': {'j': 2, 'k': 3, 'l': 4}}
0 голосов
/ 05 февраля 2020

Словари в Python явно не упорядочены. В банкомате в итерируемом порядке они гарантированно возвращают ключи в том порядке, в котором они были вставлены. Попробуйте использовать словарь OrderedDict из пакета collections, если вы будете часто использовать такие словари. Если вас интересует только сортировка словаря по первому значению его значений, сработает следующее:

def get_sort_key(x):
    def get_key(elt):
        for k, v in x[elt].items():
            return v
    return get_key

sorted(x, key=get_sort_key(x))

Возвращает список основных ключей dict по порядку. Итератор словаря представляет собой список ключей, поэтому, вероятно, лучше использовать отсортированный по x.items(), а затем создать из него новый словарь.

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