理解Python中的dictionary.get

理解Python中的dictionary.get,python,dictionary,Python,Dictionary,我正在读这篇文章,真的很有帮助,所以请继续发帖。最流行的答案之一是: sorted(dict1, key=dict1.get) 虽然这似乎工作得很好,但我没有得到key=dict1.get部分 这里的get到底是什么,它是做什么的 我只熟悉使用get('X')从字典中提取X。。。 而且我在字典和stdtypes上找不到任何东西,所以非常感谢您的指点 注意:以下是关于get()的内容,或者这是完全不同的内容? 谢谢 获取(键[,默认]) 如果键在字典中,则返回键的值,否则为默认值。如果未给出de

我正在读这篇文章,真的很有帮助,所以请继续发帖。最流行的答案之一是:

sorted(dict1, key=dict1.get)
虽然这似乎工作得很好,但我没有得到
key=dict1.get
部分

这里的
get
到底是什么,它是做什么的

我只熟悉使用
get('X')
从字典中提取X。。。 而且我在字典和stdtypes上找不到任何东西,所以非常感谢您的指点

注意:以下是关于
get()
的内容,或者这是完全不同的内容? 谢谢

获取(键[,默认]) 如果键在字典中,则返回键的值,否则为默认值。如果未给出default,则默认为None,这样该方法就不会引发keyrerror


正如您所发现的,
get
只获取与给定键对应的值<代码>排序将遍历它传递的iterable。在这种情况下,iterable是一个
dict
,而遍历
dict
只需遍历它的键。如果您想根据值进行排序,则需要将键转换为相应的值,当然,最明显的方法是使用
get

为了澄清这一点,这适用于您是否需要基于其值排序的键列表。如果您只需要值的排序列表,您可以执行排序(dict1.values()),如果您希望键按其值排序(而不是它们映射到的值),您可以执行排序(dict1)

例如:

>>> d = {'a': 3, 'b': 2, 'c': 1}
>>> sorted(d)
['a', 'b', 'c']
>>> sorted(d.values())
[1, 2, 3]
>>> sorted(d, key=d.get)
['c', 'b', 'a']
这是一种不那么冗长、更像蟒蛇的表达方式:

sorted(dict1, key=lambda x: dict1[x] if x in dict1 else None)
请记住,在字典上迭代将返回其键,因此
get
方法接受作为字典键的参数,这些参数反过来返回键所指向的值


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

排序的
键的
参数是一个可调用的(例如函数),它采用一个参数

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

sorted([2, 3, 1])   # returns [1, 2, 3]
这是因为1<2<3

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

def string_length(s):
    return len(s)

sorted(['abcd', 'efghi', 'jk'], key=string_length)  # returns ['jk', 'abcd', 'efghi']
这是因为
string\u length('jk')

但是,您可以传递任何其他可调用函数,而不是函数。在您的示例中,这是
dict1.get
,因此对于dict中的每个键,将执行
dict1.get(key)
,并将其结果用于比较

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

sorted(dict1, key=dict1.get) # returns ['b', 'c', 'a']

这是因为
dict1.get('b')
排序([dictionary],[function])
的第二个参数是一个函数,而不是一个值:

这意味着该方法将根据应用于项的函数返回的值来比较键

函数调用后添加的括号表示传递值,而没有括号表示传递函数

dict.get(x)
是dict中键x的值

dict.get
是从dict1获取所述值的函数

如果我们有

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

sorted(d)
将比较'a','b'和'c',
sorted(d,d.get)
将比较
d.get('a')
d.get('b')
d.get('c')
,什么让你困惑?您显然知道
。get
在字典上调用的功能,这是字典中每个键所调用的功能。最好的理解方法是启动一个终端,并自己测试它,如果您已经阅读了
排序的
及其
参数)和
dict.get
,我不知道还有什么要解释的。在代码的顶部,<代码>获取<代码>,考虑阅读doc的代码>排序的< /代码>,而当你在它的时候,为什么不在文档中查找
sorted
函数的参数
key
?也许您对函数作为参数传递给另一个函数而不是显式调用的方式感到困惑?为了简化“按长度排序”,您可以使用
key=len
:-)还是那个包装函数是故意的?@MSeifert是的,我只是想让它更容易理解,所以我创建了一个新函数,但当然
key=len
也会更快地完成同样的工作,代码更少,实际上可读性更强(如果你知道这些东西是如何工作的)。
d = {'a': 3, 'b': 2, 'c': 1}