Сортировка словаря по возрастанию с элементами в начале, в исходном словаре в конце - PullRequest
0 голосов
/ 31 марта 2020

Я недавно начал изучать Python, поэтому я сначала начал изучать основы. Добравшись до словарей, я столкнулся с довольно «аккуратным» испытанием, которое я пытался обернуть вокруг себя довольно долго, но не смог. Я хотел отсортировать словарь на основе его значений в порядке возрастания, а также с учетом первых ключей, которые появляются в исходном, нетронутом словаре.

Для большей ясности, скажем, нам дали следующий словарь:

dictionary = {"A": 5, "B": 5, "C": 11, "D": 10, "E": 5, "F": 5, "G": 5} 

Я хотел отсортировать таким образом, чтобы мы получили:

{"C": 11, "D": 10, "G": 5, "F": 5, "E": 5, "B": 5, "A": 5} # Ascending order, with the keys in the 
# beginning of the original dictionary being at the end here

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

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Не рекомендуется предполагать, что словари в python могут поддерживать порядок. В информатике словари (и наборы) обычно считаются неупорядоченными. Концептуально лучше представлять порядок в виде списка.

Я также не предполагал бы, что, поскольку я использую python 3.6, тогда простой словарь будет поддерживать порядок. Вы никогда не знаете, когда ваш код может быть использован в другой версии python. Однако существует возможность использования OrderedDict https://docs.python.org/2/library/collections.html#collections .OrderedDict

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

1 голос
/ 31 марта 2020

Поддерживается в Py 3.7 +

Первая сортировка dict.items() по убыванию, а затем индекс каждого ключа, пара значений

>>> d = {"A": 5, "B": 5, "C": 11, "D": 10, "E": 5, "F": 5, "G": 5}
>>> d_items_sorted = sorted(enumerate(d.items()), 
                            key=lambda x: (x[1][1], x[0]), reverse=True)
>>> d_items_sorted
[(2, ('C', 11)), (3, ('D', 10)), (6, ('G', 5)), (5, ('F', 5)), (4, ('E', 5)), (1, ('B', 5)), (0, ('A', 5))]

Это дает нам результат, который нам нужен, теперь превратим его обратно в словарь

>>> {k: v for i, (k, v) in d_items_sorted}
{'C': 11, 'D': 10, 'G': 5, 'F': 5, 'E': 5, 'B': 5, 'A': 5}
0 голосов
/ 31 марта 2020
dictionary = {"A": 5, "B": 5, "C": 11, "D": 10, "E": 5, "F": 5, "G": 5}
keys = list(dictionary)
result = {k: v for k, v in sorted(dictionary.items(),
                                  key=lambda item: (item[1], keys.index(item[0])),
                                  reverse=True)}
print(result)
>>>> {'C': 11, 'D': 10, 'G': 5, 'F': 5, 'E': 5, 'B': 5, 'A': 5}
...