![](/img/trans.png)
[英]typing/mypy: difference between dict[key] and dict.get(key)?
[英]Difference between "key in dict" and "dict.get(key)" on key check
當我在做Leetcode 820 ,構建一個 Trie 時,我的代碼中有一個錯誤。 我找到了它,也更正了它,但不明白為什么。 有人可以幫忙嗎?
我在這里做了一個簡單的測試代碼。 程序 1 和程序 2 做同樣的事情,即給定一個單詞列表words
,它以這些單詞的相反順序構建一個 Trie。 變量trie
存儲Trie 的根,變量leaves
存儲每個單詞的開始字符。 程序 1 和程序 2 之間的唯一區別在於# difference
,我重點關注 2 程序中leaves
的不同結果。
words = ["time", "atime", "btime"]
# program 1
trie = dict()
leaves = []
for word in words:
node = trie
for c in reversed(word):
if c not in node: # difference
node[c] = dict()
node = node[c]
leaves.append(node)
print("from program 1: ")
print(leaves)
# program 2
trie = dict()
leaves = []
for word in words:
node = trie
for c in reversed(word):
if not node.get(c): # difference
node[c] = dict()
node = node[c]
leaves.append(node)
print("from program 2: ")
print(leaves)
然而leaves
的輸出是完全不同的。
from program 1:
[{'a': {}, 'b': {}}, {}, {}]
from program 2:
[{}, {}, {}]
誰能幫助解釋為什么程序 1 和程序 2 中的leaves
結果不同? 提前非常感謝!
c not in node
只有在node
不包含鍵c
時才能為 True。
很多事情都可以使not node.get(c)
返回 True。 任何虛假值,例如空list
、 dict
或str
或類似0
或0.0
的東西,評估為 boolean False,就像None
一樣。 因此,任何時候node
包含c
,但具有虛假值時,您都有可能得到假陰性。
如果您絕對確定您的映射不能包含 None 值,您可以執行以下操作:
if node.get(c) is not None:
當然,如果顯式檢查一個鍵總是比通過其他方式隱式檢查更好,因為這樣會產生意想不到的副作用。
一個明顯的區別:
key in dict
的 key 只會給你一個錯誤的值。dict.get(key)
將為您提供該鍵的實際值,然后將其視為真值或假值。 因此,如果現有鍵的值是錯誤的(例如零或空字符串),則if
語句將不會觸發(盡管它會在上一個要點中觸發)。以下示例顯示了這一點:
>>> d = {1: 0, 2: 42}
>>> 1 in d
True
>>> if d.get(1): print("yes")
...
>>> 2 in d
True
>>> if d.get(2): print("yes")
...
yes
如果看起來你只是想確定一個鍵是否存在,那么key in dict
是 go 的正確方法(你並不關心值是什么,只關心值是否存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.