今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。
这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
今天,我遇到了dict方法get,它在字典中给定一个键,返回相关的值。
这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以只做dict[key],它返回相同的东西:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
当前回答
什么是dict.get()方法?
如前所述,get方法包含一个附加参数,用于指示缺少的值。来自文档
get(键(默认)) 如果key在字典中,则返回key的值,否则为default。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。
一个例子是
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
哪里有提高速度的地方吗?
正如这里提到的,
现在看来,这三种方法表现出相似的性能(彼此相差约10%),或多或少与单词列表的属性无关。
早期的get相当慢,但是现在的速度几乎是相当的,以及返回默认值的额外优势。但是为了清除所有的查询,我们可以在一个相当大的列表上进行测试(注意,测试只包括查找所有有效的键)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
现在使用timeit为这两个函数计时
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
正如我们所看到的,查找比get快,因为没有函数查找。这可以通过这个看出
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
它在哪里有用?
当您在查找字典时希望提供一个默认值时,它将非常有用。这减少了
if key in dic:
val = dic[key]
else:
val = def_val
val = dic.get(key,def_val)
在哪里它是无用的?
当您希望返回一个KeyError,说明特定的键不可用时。返回默认值也有风险,即特定的默认值也可能是键!
是否可能在dict['key']中有get like特征?
是的!我们需要在dict子类中实现__missing__。
示例程序可以是
class MyDict(dict):
def __missing__(self, key):
return None
一个小小的示范就可以了
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
其他回答
这样做的目的是,如果没有找到键,您可以给出一个默认值,这非常有用
dictionary.get("Name",'harry')
使用.get()时需要注意的一个问题:
如果字典包含调用.get()中使用的键,且其值为None,则.get()方法将返回None,即使提供了默认值。
例如,下面返回None,而不是'alt_value',这可能是预期的:
d = {'key': None}
assert None is d.get('key', 'alt_value')
.get()的第二个值仅在提供的键不在字典中时才返回,而不是在该调用的返回值为None时才返回。
什么是dict.get()方法?
如前所述,get方法包含一个附加参数,用于指示缺少的值。来自文档
get(键(默认)) 如果key在字典中,则返回key的值,否则为default。如果没有给出default,则默认为None,因此该方法永远不会引发KeyError。
一个例子是
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
哪里有提高速度的地方吗?
正如这里提到的,
现在看来,这三种方法表现出相似的性能(彼此相差约10%),或多或少与单词列表的属性无关。
早期的get相当慢,但是现在的速度几乎是相当的,以及返回默认值的额外优势。但是为了清除所有的查询,我们可以在一个相当大的列表上进行测试(注意,测试只包括查找所有有效的键)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
现在使用timeit为这两个函数计时
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
正如我们所看到的,查找比get快,因为没有函数查找。这可以通过这个看出
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
它在哪里有用?
当您在查找字典时希望提供一个默认值时,它将非常有用。这减少了
if key in dic:
val = dic[key]
else:
val = def_val
val = dic.get(key,def_val)
在哪里它是无用的?
当您希望返回一个KeyError,说明特定的键不可用时。返回默认值也有风险,即特定的默认值也可能是键!
是否可能在dict['key']中有get like特征?
是的!我们需要在dict子类中实现__missing__。
示例程序可以是
class MyDict(dict):
def __missing__(self, key):
return None
一个小小的示范就可以了
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
它允许你在缺少键时提供一个默认值:
dictionary.get("bogus", default_value)
返回default_value(不管你选择它是什么),而
dictionary["bogus"]
会引发一个KeyError。
如果省略,default_value为None,这样
dictionary.get("bogus") # <-- No default specified -- defaults to None
返回None
dictionary.get("bogus", None)
会。
Get接受第二个可选值。如果指定的键在您的字典中不存在,则将返回此值。
dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'No available data')
>> 'No available data'
如果不提供第二个参数,则返回None。
如果使用dictionary['Year']中的索引,则不存在键将引发KeyError。