理解Python中的dictionary.get

pat*_*ick 3 python dictionary

我正在阅读这篇关于排序词典的帖子.其中一个最受欢迎的答案表明:

sorted(dict1, key=dict1.get)
Run Code Online (Sandbox Code Playgroud)

虽然这似乎完全正常,但我没有得到这个key=dict1.get部分.

究竟是get什么,它做了什么?

我只熟悉get('X')从字典中提取X ...而且我在字典和stdtypes 的文档中找不到任何内容,所以任何指针都非常感谢!

NB这里是他们要说的get(),或者这是完全不同的东西?谢谢!

get(key [,default])如果key在字典中,则返回key的值,否则返回default.如果未给出default,则默认为None,因此此方法永远不会引发KeyError

zvo*_*one 9

key到参数sorted是一个可调用(例如,功能),它有一个参数.

默认情况下,sorted通过将值相互比较来对值进行排序.例如:

sorted([2, 3, 1])   # returns [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

这是因为1 <2 <3.

另一方面,如果应该使用不同的值进行比较,则可以使用key.例如,要按长度对字符串进行排序,一个coudld会执行以下操作:

def string_length(s):
    return len(s)

sorted(['abcd', 'efghi', 'jk'], key=string_length)  # returns ['jk', 'abcd', 'efghi']
Run Code Online (Sandbox Code Playgroud)

这是因为string_length('jk') < string_length('abcd') < string_length('efghi').

但是,您可以传递任何其他可调用函数,而不是函数.在您的示例中,也就是说dict1.get,对于dict中的每个键,dict1.get(key)都将执行,并且将使用该结果进行比较.

dict1 = {'a':3, 'b':1, 'c':2}

sorted(dict1, key=dict1.get) # returns ['b', 'c', 'a']
Run Code Online (Sandbox Code Playgroud)

这是因为dict1.get('b') < dict1.get('c') < dict1.get('a').


Mos*_*oye 5

sorted(dict1, key=dict1.get)
Run Code Online (Sandbox Code Playgroud)

是一种更简洁、更Python化的表达方式:

sorted(dict1, key=lambda x: dict1[x] if x in dict1 else None)
Run Code Online (Sandbox Code Playgroud)

请记住,迭代字典将返回其键,因此该get方法采用字典键作为参数,而字典键又返回键指向的值。

TL;DR 这是一种使用值作为排序标准对字典键进行排序的简单方法。