Сортировка dict () по полю класса - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть словарь с объектами в качестве значений.Эти объекты являются экземплярами следующего класса:

Class A():

    def __init__(self, x=''):
        self.x = x
        self.count = 0

Поэтому записи словаря будут иметь вид: {'some_key', instance_of_class_A}

Теперь я хотел бы отсортировать словарь по значениюA.count в instance_of_A.

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

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Чтобы отсортировать значения словаря, вы можете сделать следующее:

sorted_values = sorted(dict.values(), key=lambda x: x.count)

Однако я не вижу необходимости в сортировке всего словаря.Если значение ключа может содержать список A объектов, и вы хотите отсортировать это:

dict[key] = sorted(dict[key], key=lambda x: x.count)
0 голосов
/ 28 ноября 2018

В то время как словари упорядочены по вставке в Python 3.6 (как деталь реализации) и официально в 3.7+, для надежного упорядоченного словаря используйте collections.OrderedDict:

from collections import OrderedDict

res = OrderedDict(sorted(d.items(), key=lambda x: x[1].count))

OrderedDict является подклассом dict, поэтому вы не должны терять функциональность.

Если такой порядок * естественный или типичный для ваших объектов класса, рассмотрите возможность определения__eq__ и __lt__ методов для вашего класса , как описано здесь , а затем используйте:

from operator import itemgetter

res = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
res = OrderedDict(sorted(d.items(), key=itemgetter(1)))  # functional equivalent
0 голосов
/ 28 ноября 2018

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

old_dict = { ... }
new_dict = dict(sorted(old_dict.items(), key=lambda kv: kv[1].count))
...