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

新手上路,请多包涵

今天,我遇到了 dict 方法 get 给定字典中的键,返回关联的值。

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

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

原文由 stensootla 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 385
2 个回答

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

 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)

将。

原文由 unutbu 发布,翻译遵循 CC BY-SA 3.0 许可协议

什么是 dict.get() 方法?

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

> get(key[, default])
>
> ```
>
> 如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为无,因此此方法永远不会引发 `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


> **任何地方都有速度改进吗?**

正如 [这里](https://wiki.python.org/moin/PythonSpeed/PerformanceTips) 提到的,

> 似乎这三种方法现在都表现出相似的性能(彼此相差大约 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`](https://docs.python.org/3/library/timeit.html) 对这两个函数进行计时

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


正如我们所见,查找比获取更快,因为没有函数查找。这个可以通过 [`dis`](https://docs.python.org/3/library/dis.html) 看出来

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` 类的功能?**

是的!我们需要在字典子类中实现 [`__missing__`](https://docs.python.org/3/reference/datamodel.html#object.__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’

”`

原文由 Bhargav Rao 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题