簡體   English   中英

密鑰檢查中“key in dict”和“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。 任何虛假值,例如空listdictstr或類似00.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM