Effective PYTHON – 例16: 檢查dictionary key值存在時,使用get而非KeyError

Effective PYTHON 2rd

在使用dictionary時,若key值不存在時會產生KeyError,我們有四種方式可以處理。

counters = {
    'key1': 1,
    'key2': 2
}

key = 'key0'


#法一:
#先檢查key值是否存在
if key in counters:
    count = counters[key]
else:
    count = 0

counters[key] = count + 1


#法二:
#用try/except處理KeyError
try:
    count = counters[key]
except KeyError:
    count = 0

counters[key] = count+1


#法三:
#使用get
count = counters.get(key, 0)
counters[key] = count + 1


#法四:
#使用setdefault
counters.setdefault(key, 0)
counters[key] += 1

get會把第一個引數當作key回傳對應的value,若key不存在不會丟出KeyError而是會回傳第一個引數的值,在此例中就會回傳0。若是沒有第二個引數會回傳None,在此例中應該比較推薦用get的用法。

而setdefault則會把value直接用第二個引數修改。通常是適合用在value是container的狀況,但書中建議這種情況可能要考慮用defaultdic來代替一般的dictionary。

key = 'key0'
votes = {
    'key1': ['Bob', 'Alice'],
    'key2': ['Coco']
}

names = votes.get(key)
if names is None:
    votes[key] = names = []

#或是用 := (Walrus Operator, assignment expression)
if (names := votes.get(key)) is None:
    votes[key] = names = []

#這種情況用setdefault最簡潔
names = votes.setdefault(key, [])

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料