如何按照词典编纂顺序排列字典中的值



我在这里有这个代码:

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

我使用这段代码的目标是获得具有最大值的键,如果两个键具有相同的值,则选择词典编纂顺序中第一个键。

现在,代码的第一部分工作得很好!然而,我在第二部分遇到了麻烦。我读了一些关于这个主题的代码,但一直没能找到让它发挥作用的方法。

代码应该如何工作的示例:

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

(应该印哈利波特(但我的代码打印"ilo and stich">

另一个例子:

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

(此输出正常工作(

您可以通过以下方式获得完全排序的列表:

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

然后拍第一个。

它的工作原理是将tuple定义为排序标准-tuples按第一个值排序,如果第一个值绘制,则按第二个值排序。

通过-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

如果你只想要最受欢迎的书,可以使用min:

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(,最小值为O(n(。无需对列表进行排序,只需找到最小值即可。

最新更新