Я застрял в приведенном выше сообщении об ошибке для программы ниже. Программа должна отсортировать словарь (с именем sc) по значению (по убыванию) и, если значения совпадают, по алфавиту (по возрастанию).

def grootste_leveraars (sc):
    sc2 = {}
    for i in sc:
        if not sc[i]:
            sc2[i] = uitstroomsnelheid_goederen(sc, i)
    return (sorted(sc2, key = lambda x: (-x[1], x[0])))

Uitstroomsnelheid_goederen() - еще одна функция в моей программе, но я не думаю, что она актуальна. Если я сделаю небольшое изменение:

(sorted(sc2.items(), key = lambda x: (-x[1], x[0]))) 

Он работает, но он также напечатает значение. Мне просто нужен список ключей.

Это возможно?

-1
esitboke 5 Дек 2020 в 21:14

2 ответа

Лучший ответ

Вам придется немного изменить свой подход. То, что у вас есть, работает с tuple из items и возвращает tuple. Вы хотите работать с ключами и возвращать только ключи.

>>> # let sc2 be:
>>> sc2 = {'aaa': 10, 'bcd': 5, 'abc': 10, 'cde': 1}
>>>
>>> # your approach:
>>> sorted(sc2.items(), key = lambda x: (-x[1], x[0]))
[('aaa', 10), ('abc', 10), ('bcd', 5), ('cde', 1)]
>>>
>>> # see this one:
>>> sorted(sc2, key = lambda x: (-sc2[x], x))
['aaa', 'abc', 'bcd', 'cde']  
1
Nikolaos Chatzis 5 Дек 2020 в 19:34

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

import functools

sc2 = {'wsd': 10, 'bcd': 5, 'abc': 10, 'cde': 1}

def my_cmp(a,b):
    if sc2[a] == sc2[b]:
        return -1 if a > b else 1
    elif sc2[a] > sc2[b]:
        return 1
    else:
        return -1

s = sorted(sc2, key=functools.cmp_to_key(my_cmp), reverse=True)

Output:-> ['abc', 'wsd', 'bcd', 'cde']
0
mohit manuja 5 Дек 2020 в 21:00