如何按字典顺序对字典中的值进行排序?

时间:2018-11-28 20:16:31

标签: python dictionary

我在这里有此代码:

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 :(得分:3)

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

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

答案 1 :(得分:1)

如果您只想要最受欢迎的书,则可以使用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)。无需对列表进行排序,只需查找最小值即可。