Как упорядочить значения в словаре в порядке лексикографии? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть этот код здесь:

def most_popular_book(book_loans):
    vBL = book_loans.values()
    kBL = book_loans.keys()
    items = book_loans.items()
    print items
    kBL = sorted(kBL, key=str.lower)
    mvBL = max(vBL)
    for key,vaule in items:
        if vaule == mvBL:
            return key

Моя цель с этим кодом состоит в том, чтобы получить ключ с наибольшим значением, и если 2 ключа имеют одинаковые значения, выберите тот, который стоит первым впорядок лексикографии.

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

пример того, как должен работать код:

print most_popular_book({'harry potter':['yossi','adam'], 
'lilo and stich':['yossi', "adam"], 'catch-22':['adam'] })

'harry potter'

(он должен напечатать Гарри Поттера), но мой код печатает 'lilo and stich'

другой пример:

{'the little prince': ['yossi'], 'harry potter': ['yossi', 'assaf'], 
 'catch-22': ['yossi', 'dana']}

'catch-22'

(этовыход работает правильно)

Ответы [ 2 ]

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

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

def most_popular_book(books):
    result, _ = min(books.items(), key=lambda x: (-len(x[1]), x[0]))
    return result


print(most_popular_book({'harry potter': ['yossi', 'adam'],
                         'lilo and stich': ['yossi', "adam"], 'catch-22': ['adam']}))
print(most_popular_book({'the little prince': ['yossi'], 'harry potter': ['yossi', 'assaf'],
                         'catch-22': ['yossi', 'dana']}))

Вывод

harry potter
catch-22

Идея та же, что и в ответе @PatrickArtner, единственная разница в том, что сортировка - O (nlogn) , а min - O (n) .Не нужно сортировать список, только чтобы найти минимум.

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

Вы можете получить полностью отсортированный список:

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

и взять первый.

Работает путем определения tuple в качестве критерия сортировки - tuples сортируются по 1-му значению, затем 2-му значению, если 1-е значение выводится и т. Д.

Сортировка по -len() "инвертирует"это (вы также можете указать параметр reverse=True для сортировки - любой из них работает.

fancy = sorted( {'harry potter':['yossi','adam'], 'lilo and stich':['yossi', "adam"],
                 'catch-22':['adam'] }.items(), key = lambda x:(-len(x[1]), x[0])) 

print(fancy)
print(fancy[0][0])

Вывод:

[('harry potter', ['yossi', 'adam']), ('lilo and stich', ['yossi', 'adam']),
 ('catch-22', ['adam'])]

harry potter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...