выборочная сортировка словаря по значениям - PullRequest
0 голосов
/ 13 января 2020

У меня есть простой словарь и список, который я хотел бы отсортировать по значениям в моем словаре.

data_dict = {'foo' : 'one', 'bar' : 'two', 'foobar' : 'three', 'notinsort' : 'four'}

custom_sort = ['three','one','two'] 

Моя собственная попытка заключалась в использовании словарного понимания с настраиваемым ключом в сортировке. :

{k:v for k,v in sorted(data_dict.items(), key=lambda i : custom_sort.index(i[1]) )}

, которая по праву вернет ValueError: 'four' is not in list

без проблем, я могу отфильтровать это с помощью оператора if-else внутри лямбды? так как я все еще хочу, чтобы значения были изначально отсортированы моей пользовательской сортировкой, тогда будет естественная сортировка.

{
    k: v
    for k, v in sorted(
        data_dict.items(),
        key=lambda i: custom_sort.index(i[1])
        if [k for k in data_dict.values() if k in custom_sort] 
        else sorted(data_dict.items()),
    )
}

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

мой желаемый вывод из приведенного выше ввода - :

data_dict = {'foobar' : 'three', 'foo' : 'one', 'bar' : 'two', 'notinsort' : 'four'}

У меня возникли следующие вопросы:

Как отсортировать словарь по значению? & Пользовательская сортировка Python Словарь

но не смог прийти к ответу.

1 Ответ

4 голосов
/ 13 января 2020

Вместо этого вы могли бы заранее определить словарь для поиска (уменьшив сложность до сложности сортировки, т.е. O(n log n), так как поиск по словарю O(1)). Это работает для python 3.6>, где поддерживается порядок словаря ie:

d = {v:k for k,v in enumerate(custom_sort)}
# {'three': 0, 'one': 1, 'two': 2}
dict(sorted(data_dict.items(), key=lambda x: d.get(x[1], float('inf'))))
# {'foobar': 'three', 'foo': 'one', 'bar': 'two', 'notinsort': 'four'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...