为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要得到(键)而不是迪克[键]?

为什么要得到(键)而不是迪克[键]?

函数式编程 2019-06-06 13:05:10
为什么要得到(键)而不是迪克[键]?今天,我遇到了dict方法get其中,给定字典中的一个键,则返回关联的值。这个函数的用途是什么?如果我想在字典中找到一个与键相关的值,我可以这样做。dict[key],并返回相同的内容:dictionary = {"Name": "Harry", "Age": 17}dictionary["Name"]dictionary.get("Name")
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

它允许您在缺少键时提供默认值:

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)

会的。


查看完整回答
反对 回复 2019-06-06
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

什么是dict.get()方法?

如前所述,get方法包含一个指示缺失值的附加参数。从文件中

get(key[, 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更快,因为没有函数查找。这可以通过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']?

是!我们需要实现__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'


查看完整回答
反对 回复 2019-06-06
?
catspeake

TA贡献1111条经验 获得超0个赞

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

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

如果不给出第二个参数,None会被归还。

如果使用索引,如dictionary['Year'],不存在的键将引发KeyError.


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 380 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信