【问题标题】:Python Dictionary: "in" vs "get"Python 字典:“in”与“get”
【发布时间】:2018-03-12 13:42:29
【问题描述】:

在字典中搜索元素时,我对使用“in”和“get”有点困惑。

根据这个时间复杂度表,here:当使用“in”时,我们得到 O(n),而“get”得到 O(1)。

在下面这两个sn-ps代码中,实现的都是一样的,但是显然用get会快很多?

#Recall that for "get" the second parameter is returned if key is not found

#O(1) time complexity
if dict.get(key, False):
   return "found item"

#O(n) time complexity
if key in dict:
   return "found item"

我不明白当他们都可以实现相同的事情时,使用 get 会如何改变时间复杂度。除了 get 调用将实际返回该值(如果找到)。

问题:当它们都达到相同的结果时,“in”时间复杂度是 O(n) 而“get”只有 O(1) 怎么办?如果这是真的,是否有理由在字典中使用“in”?

【问题讨论】:

  • 这是 listin 的时间复杂度。
  • 该链接并没有说出您认为的内容。两者的时间复杂度相同
  • 对于一个字典,inget() 都是 O(1) 的预期时间,但 O(len(dict)) 是最坏的情况。 in 是测试成员资格的明显方法,因此请使用它。 dict.get(key, False) 甚至都不正确(例如,假设 key 为 0,或其他一些“类似假”的值)。
  • @Tim 对,我没想到,谢谢

标签: python python-3.x dictionary hash


【解决方案1】:

get() 返回给定键的值,如果该键存在于字典中。

in 返回一个布尔值,具体取决于该键是否存在于字典中。

如果您需要该值,请使用get()。如果您只需要测试密钥是否存在,请使用in

【讨论】:

  • 但正如我所说,使用“in”时间复杂度比只使用“get”更糟糕。那么为什么要使用“in”呢?我可以用更快的“get”达到同样的结果
  • @Phillip 仔细阅读您提供的链接上的表格。 in 的时间复杂度是针对列表而不是字典给出的。
  • @Code-Apprentice 您的意思是,当使用 dict 时,时间复杂度并不重要,但如果它是一个列表,您必须谨慎使用对吗?
  • @allexiusw 不,时间复杂度对这两种数据结构都很重要,因此您可以决定使用正确的一种。但是,OP 错误地阅读了文档。他们正在查看与列表一起使用的in 的时间复杂度,这与将in 与字典一起使用时不同。自从以前的 cmets 在这里制作以来,wiki 已经过编辑,因此它们甚至不再相关。
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多