Как создать список ключей в порядке убывания значений - PullRequest
1 голос
/ 04 апреля 2019

Используя словарь (например, {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}), я хочу вернуть список ключей в порядке убывания на основе их ценности. Если две или более клавиш имеют одинаковое значение, то значения будут упорядочены в соответствии с алфавитным порядком клавиш. Используя предыдущий словарь в качестве примера, я хочу, чтобы моя функция возвращала: ['cd', 'aa', 'ab', 'bb'].

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

def f(d: Dict[str, float]) -> List[str]:

    accumulator_list = []

    # do something

    return accumulator_list

Изменить: Мой вопрос уникален, потому что другой вопрос был о функции, которая возвращает список значений ниже порога, в то время как моя функция не имеет ничего общего с порогом.

Ответы [ 4 ]

0 голосов
/ 04 апреля 2019

Взгляните на документацию dict.

В словарях есть метод с именем keys, который возвращает итератор с ключами. Вы можете получить отсортированный список от итератора с помощью sorted.

В вашем примере:

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}
l = sorted(d.keys()) # l = ['aa','ab','bb','cd']

Другими полезными итераторами словарей являются items и values.

0 голосов
/ 04 апреля 2019

Это отличный вариант использования для itemgetter () :

from operator import itemgetter

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

tups = list(d.items())
tups.sort(key = itemgetter(0))                   # Sort by keys.
tups.sort(key = itemgetter(1), reverse = True)   # Sort by vals, reversed.
keys = list(map(itemgetter(0), tups))

print(keys)
0 голосов
/ 04 апреля 2019

Вы можете создать список с кортежами типа (-3.0, 'aa') - значение в качестве первого и с минусом, чтобы он сортировался по значению по убыванию и по возрастанию ключа.

И затем вы можете отсортировать его, используя sorted()

data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = [(-value, key) for key, value in data.items()]
new = sorted(new)
new = [key for value, key in new]

print(new)

['cd', 'aa', 'ab', 'bb']

Или вы можете сделать то же самое непосредственно в sorted, используя key=

data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = sorted(data.items(), key=lambda x: (-x[1], x[0]))
new = [key for key, value in new]

print(new)

водна строка

data = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'cd': 6.0}

new = [key for key, value in sorted(data.items(), key=lambda x: (-x[1], x[0]))]

print(new)
0 голосов
/ 04 апреля 2019

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

def f(d):
    keys = sorted(d)
    keys = sorted(keys, key=lambda k: d[k], reverse=True)
    return keys

d = {'aa': 3.0, 'bb': 1.2, 'ab': 3.0, 'zz': 6.0, 'cd': 6.0}
print(f(d))

вывод:

['cd', 'zz', 'aa', 'ab', 'bb']

Из документации сортировки: https://docs.python.org/3/howto/sorting.html#sort-stability-and-complex-sorts

...