Python字典:使用"in"和"get"的区别

9
我有点困惑在使用字典时,搜索元素应该使用“in”还是“get”。
根据这个时间复杂度表格,此处:使用“in”会得到O(n),而使用“get”会得到O(1)。
下面这两个代码片段实现了相同的功能,但显然使用“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”?


3
这是在列表中使用 in 的时间复杂度。 - user2357112
2
那个链接并没有说你想要的内容。两者的时间复杂度是相同的。 - juanpa.arrivillaga
6
对于一个字典而言,inget() 都是期望时间复杂度为 O(1) 的操作,但最坏情况下的时间复杂度是 O(len(dict))。在检查一个元素是否属于字典时,使用 in 是显而易见的选择。dict.get(key, False) 不正确(例如,假设键为 0 或其他类似于 "false" 的值)。 - Tim Peters
@Tim 对,我没有考虑到那个,谢谢。 - Phil
1个回答

19

get()方法在字典中查找给定键的值,如果该键存在,则返回其对应的值。

in关键字返回一个布尔值表示该键是否存在于字典中。

如果您需要该键的值,请使用get()方法。 如果您只需要测试该键是否存在,请使用in关键字。


但是正如我所说,使用“in”的时间复杂度比仅使用“get”更糟糕。那么为什么要使用“in”呢?我可以通过使用更快的“get”来实现相同的结果。 - Phil
8
请仔细阅读您提供的链接中的表格。in的时间复杂度是针对列表而不是字典的。 - Code-Apprentice
@Code-Apprentice 你的意思是使用字典时不需要考虑时间复杂度,但如果使用列表则必须小心使用,对吗? - allexiusw
1
@allexiusw 不,时间复杂度对于数据结构来说都很重要,这样你才能决定使用正确的数据结构。然而,原帖作者错误地阅读了文档。他们看到了在列表中使用 in 的时间复杂度,但是与在字典中使用 in 时不同。自从之前的评论发表以来,维基百科已经进行了编辑,因此它们甚至不再相关。 - Code-Apprentice
4
对于字典而言,“in”和“get”的时间复杂度是相同的。[维基百科] - Smart Manoj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接