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

У меня есть этот словарь, и мне нужно отсортировать слова по значению.Но когда два или более слова имеют одинаковое значение, мне нужно отсортировать эти слова по алфавиту, но я не знаю, как это сделать.Ты можешь мне помочь?

dict = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
        'violet': 2, 'GRAY': 3, 'White': 6}

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 30 декабря 2018

Используя collections.OrderedDict, вы можете создать упорядоченное отображение, которое по-прежнему имеет преимущества словаря, такие как поиск O (1).

from collections import OrderedDict

d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7,
     'green': 5, 'BLUE': 4, 'violet': 2, 'GRAY': 3, 'White': 6}

od = OrderedDict(sorted(d.items(), key=lambda x: (x[1], x[0].casefold())))

print(od)

OrderedDict([('BLACK', 0), ('brown', 1), ('RED', 2), ('violet', 2), ('GRAY', 3),
             ('BLUE', 4), ('orange', 4), ('green', 5), ('White', 6), ('YELLOW', 7)])

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

Наконец, никогда не создавайте теневые встроенные элементы, такие как dict.Вместо имен используйте dict_ или d.

0 голосов
/ 30 декабря 2018

Использование sorted:

>>> d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
        'violet': 2, 'GRAY': 3, 'White': 6}
>> sorted(d, key=lambda i: (d[i], i.lower()))
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'BLUE', 'orange', 'green', 'White', 'YELLOW']

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

Также я переименовал вашу переменную в d потому что dict является встроенным.

Чтобы разобрать, что происходит:

sorted в словаре возвращает ключи, отсортированные по предоставленной функции key (по умолчанию это прямое сравнениеключи)

>>> sorted(d)
['BLACK', 'BLUE', 'GRAY', 'RED', 'White', 'YELLOW', 'brown', 'green', 'orange', 'violet']

Чтобы отсортировать по значению, используйте dict.get:

>>> sorted(d, key=d.get)
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'orange', 'BLUE', 'green', 'White', 'YELLOW']

Затем мы должны отсортировать по ключу в случае связи.Поскольку python сравнивает свои кортежи один за другим, мы можем создать кортеж из (value, key), и он будет сравнивать элементы, а затем, если они совпадают, он будет сравнивать элементы.

>>> (4, "blue") < (4, "orange")
True
>>> (4, "blue") < (3, "orange")
False
0 голосов
/ 30 декабря 2018

Вы можете попробовать это:

>>> d = {'BLUE': 4, 'brown': 1, 'BLACK': 0, 'YELLOW': 7, 'violet': 2, 'orange': 4, 'green': 5, 'White': 6, 'GRAY': 3, 'RED': 2}
>>> t = (zip(d.values(), d.keys()))
>>> sorted(t)
[(0, 'BLACK'), (1, 'brown'), (2, 'RED'), (2, 'violet'), (3, 'GRAY'), (4, 'BLUE'), (4, 'orange'), (5, 'green'), (6, 'White'), (7, 'YELLOW')]
0 голосов
/ 30 декабря 2018

Используйте тот факт, что tuple сравнивает свои записи один за другим.

d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
     'violet': 2, 'GRAY': 3, 'White': 6}
result = sorted(d, key=lambda k: (d[k], k.lower()))

Также исправлено, что dict не следует использовать в качестве имени переменной - это встроенный тип.

...