为什么dict.get(key)而不是dict [key]?

时间:2012-06-14 21:10:39

标签: python dictionary

今天,我遇到了dict方法get,它给出了字典中的一个键,返回了相关的值。

这个功能用于什么目的?如果我想找到与字典中的键相关联的值,我可以dict[key],它返回相同的内容:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")

12 个答案:

答案 0 :(得分:775)

如果缺少密钥,它允许您提供默认值:

dictionary.get("bogus", default_value)

返回default_value(无论你选择它是什么),而

dictionary["bogus"]

会引发KeyError

如果省略,default_valueNone

dictionary.get("bogus")  # <-- No default specified -- defaults to None

返回None,就像

一样
dictionary.get("bogus", None)

会。

答案 1 :(得分:101)

  

什么是dict.get()方法?

如前所述,get方法包含一个指示缺失值的附加参数。 From the documentation

get(key[, default])
     

如果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
  

在任何地方都有速度提升吗?

如上所述here

  

现在看来,这三种方法都表现出相似的表现(彼此相差不到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更快,因为没有函数查找。这可以通过dis

看出
>>> 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 = key[dic]
 else:
      val = def_val

到一行,val = dic.get(key,def_val)

  

哪些地方没用?

每当您想要返回KeyError时,表明特定密钥不可用。返回默认值也会带来特定默认值也可能是关键的风险!

  

是否可以在get中使用dict['key']类似功能?

是的!我们需要在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'

答案 2 :(得分:26)

get采用第二个可选值。如果字典中不存在指定的键,则返回此值。

dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'No available data')
>> 'No available data'

如果您不提供第二个参数,则会返回None

如果您使用dictionary['Year']中的索引,则不存在的密钥会引发KeyError

答案 3 :(得分:18)

我将举例说明使用python抓取网页数据,很多时候你会得到没有值的密钥,在这种情况下,如果你使用字典会出现错误[&#39; key&#39;] ,而dictionary.get(&#39; key&#39;,&#39; return_otherwise&#39;)没有问题。

同样,如果您尝试从列表中捕获单个值,我会使用&#39; .join(列表)而不是列表[0]。

希望它有所帮助。

[编辑]这是一个实际的例子:

说,您正在调用API,它返回您需要解析的JOSN文件。第一个JSON如下所示:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

第二个JOSN是这样的:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

请注意,第二个JSON缺少&#34; submitdate_ts&#34; key,在任何数据结构中都很正常。

因此,当您尝试在循环中访问该键的值时,可以使用以下命令调用它:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

你可以,但它会给你第二条JSON线的追溯错误,因为钥匙根本就不存在。

对此进行编码的适当方式可能如下:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{&#39; x&#39;:无}是为了避免第二级出错。当然,如果你正在进行抓取,你可以在代码中建立更多的容错能力。就像首先指定if条件

一样

答案 4 :(得分:15)

目的是如果找不到密钥,你可以给出一个默认值,这是非常有用的

dictionary.get("Name",'harry')

答案 5 :(得分:2)

  

这个功能用于什么目的?

一个特殊的用法是用字典计算。让我们假设你想要计算给定列表中每个元素的出现次数。这样做的常用方法是创建一个字典,其中键是元素,值是出现次数。

fruits = ['apple', 'banana', 'peach', 'apple', 'pear']
d = {}
for fruit in fruits:
    if fruit not in d:
        d[fruit] = 0
    d[fruit] += 1

使用.get()方法可以使这段代码更加紧凑和清晰:

for fruit in fruits:
      d[fruit] = d.get(fruit, 0) + 1

答案 6 :(得分:2)

一个不同之处可能是一个优点,那就是,如果我们正在寻找一个不存在的键,我们将得到None,这与使用方括号表示法不同,在这种情况下,我们将抛出错误:

print(dictionary.get("address")) # None
print(dictionary["address"]) # throws KeyError: 'address'

关于get方法的最后一件很酷的事情是,它收到了一个默认值的附加可选参数,也就是说,如果我们试图获取学生的得分值,但是该学生没有得分键我们可以改为0。

因此,不要这样做(或类似操作):

score = None
try:
    score = dictionary["score"]
except KeyError:
    score = 0

我们可以这样做:

score = dictionary.get("score", 0)
# score = 0

答案 7 :(得分:1)

  

为什么用dict.get(key)代替dict [key]?

0。摘要

dict[key]相比,dict.get在查找密钥时提供了后备值。

1。定义

get(key [,default])4. Built-in Types — Python 3.6.4rc1 documentation

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

d = {"Name": "Harry", "Age": 17}
In [4]: d['gender']
KeyError: 'gender'
In [5]: d.get('gender', 'Not specified, please add it')
Out[5]: 'Not specified, please add it'

2。它解决的问题。

如果没有default value,则必须编写繁琐的代码来处理此类异常。

def get_harry_info(key):
    try:
        return "{}".format(d[key])
    except KeyError:
        return 'Not specified, please add it'
In [9]: get_harry_info('Name')
Out[9]: 'Harry'
In [10]: get_harry_info('Gender')
Out[10]: 'Not specified, please add it'

作为一种方便的解决方案,dict.get引入了一个可选的默认值,避免使用未经编码的代码。

3。结论

dict.get有一个额外的默认值选项来处理异常,如果字典中没有键

答案 8 :(得分:1)

使用.get()时要注意的陷阱:

如果字典包含调用.get()中使用的键,并且其值为None,则即使提供了默认值,.get()方法也将返回None

例如,以下代码返回None,而不是预期的'alt_value'

d = {'key': None}
d.get('key', 'alt_value')

.get()的第二个值仅在提供的键不在字典中时返回,而在该调用的返回值为None时则不返回。

答案 9 :(得分:1)

我没有看到提到的另一个用例是作为 keysortedmax 等函数的 min 参数。 get 方法允许根据键的值返回键。

>>> ages = {"Harry": 17, "Lucy": 16, "Charlie": 18}
>>> print(sorted(ages, key=ages.get))
['Lucy', 'Harry', 'Charlie']
>>> print(max(ages, key=ages.get))
Charlie
>>> print(min(ages, key=ages.get))
Lucy

感谢此 answer 提供此用例的不同问题!

答案 10 :(得分:0)

根据使用情况,请使用此get方法。

<强>示例1

In [14]: user_dict = {'type': False}

In [15]: user_dict.get('type', '')

Out[15]: False

In [16]: user_dict.get('type') or ''

Out[16]: ''

<强>例2

In [17]: user_dict = {'type': "lead"}

In [18]: user_dict.get('type') or ''

Out[18]: 'lead'

In [19]: user_dict.get('type', '')

Out[19]: 'lead'

答案 11 :(得分:0)

  • dict.get如果密钥不存在,则默认不返回任何内容,但是如果您将其作为第二个参数,它将返回该密钥不存在的情况。

  • 如果密钥不存在,OTOH dict[key]将引发KeyError

这是一个示例(阅读评论):

>>> d={'a':[1,2,3],'b':[4,5,6]} # Create a dictionary
>>> d['c'] # Hoops, error key does not exist
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    d['c']
KeyError: 'c'
>>> d.get('c') # no error because of `get`, so nothing returned
>>> print(d.get('c')) # i print it, oh `None` is the output
None
>>> d.get('c',100) # Okay now i set second argument's value to `100`, hoopa output is `100`
100
>>> d['a'] # Works, key exist
[1, 2, 3]
>>> d.get('a') # work too, key exist
[1, 2, 3]