PYTHON3 СЛОВАРЬ - Почему первый ответ неправильный, а второй ответ правильный - PullRequest
0 голосов
/ 26 марта 2020

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

Мое первое требование - сначала упорядочить словарь по значению в порядке возрастания, а затем по ключу в порядке убывания

Мое второе требование - упорядочить словарь сначала по значению в порядке убывания, а затем по ключу в порядке убывания

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

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

from collections import OrderedDict

#Value Descending and then Key Ascending[Descending means -ve,Ascending means +ve]
def sorted_dict_by_firstValue_secondKey(dictionary,AscendingKey=True,AscendingValue=True,reverse=False):
    Dictionary = OrderedDict()
    keySign = 1
    valSign = 1
    if(AscendingKey==False):
        keySign = -1
    if(AscendingValue==False):
        valSign = -1
    for key,value in sorted(dictionary.items(),key=lambda item: (valSign*item[1],keySign*item[0]),reverse=reverse):
        Dictionary[key] = value
    return Dictionary


album = {'carl':40,'oswald':2,'bob':1,'danny':3,'alice':1,'alan':2,'tom':3,'alquaida':40, 'elizabeth':40}



ValAscKeyDescDictionary1 = sorted_dict_by_firstValue_secondKey(album,AscendingValue=True,AscendingKey=False)
ValAscKeyDescDictionary2 = sorted_dict_by_firstValue_secondKey(album,AscendingValue=False,AscendingKey=True,reverse=True)


ValDescKeyDescDictionary1 = sorted_dict_by_firstValue_secondKey(album,AscendingValue=False,AscendingKey=False)
ValDescKeyDescDictionary2 = sorted_dict_by_firstValue_secondKey(album,reverse=True)

print("--------------------------------------------------------------------------------")
print("\n\nDICTIONARY ASCENDING SORTED BY VALUE AND THEN BY KEYS ALBHABETICALLY DESCENDING FOR SAME VALUES")


print("InCorrect Answer- ",ValAscKeyDescDictionary1)
print("Correct Answer- ",ValAscKeyDescDictionary2)

print("--------------------------------------------------------------------------------")

print("\n\nDICTIONARY DESCENDING SORTED BY VALUE AND THEN BY KEYS ALBHABETICALLY DESCENDING FOR SAME VALUES")

print("InCorrect Answer- ",ValDescKeyDescDictionary1)
print("Correct Answer- ",ValDescKeyDescDictionary2)

print("--------------------------------------------------------------------------------")

1 Ответ

0 голосов
/ 26 марта 2020

Наблюдение: когда вы устанавливаете AscendingKey=False, оно работает неправильно.

Это потому, что в этом случае вы используете (valSign*item[1],-1*item[0]) для сортировки. И item[0] является ключом, который является строкой в ​​вашем случае.

Умножение отрицательного целого числа на строку, кажется, всегда дает пустую строку:

>>> -1*"hello"
''
>>> -2*"hello"
''
>>> 1*"hello"
'hello'
>>> 2*"hello"
'hellohello'

Недостаток в вашем Таким образом, logi c означает, что вы не можете инвертировать порядок сортировки строк, умножив их на минус один. Вместо этого вам придется отсортировать по их разности по «наибольшему» значению, чтобы получить нисходящий порядок.

В вашем случае, вероятно, проще написать компаратор самостоятельно, как указано в в этом ответе

...