[英]dict.setdefault() is used when value already exists
我正在嘗試將新關鍵字添加到現有字典中,並將其設置為默認值,即上一個關鍵字的值。
def check_data(end, start, profile):
print(profile)
for day in range((end-start).days+1):
profile.setdefault(start+datetime.timedelta(day),
{'expediture':0, 'top-up':0,
'budget':profile[start+datetime.timedelta(day-1)]['budget'] })
start = datetime.date(2019,2,1)
end = datetime.date(2019,2,17)
check_data(end, start, month_data)
從print(profile)
輸出:
{datetime.date(2019, 2, 1): {'expediture': 0, 'top-up': 0, 'budget': 100.0}}
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-4-e44462627692> in <module>
----> 1 check_data(end, start, month_data)
<ipython-input-2-90b936150b04> in check_data(end, start, profile)
20 profile.setdefault(start+datetime.timedelta(day),
21 {'expediture':0, 'top-up':0,
---> 22
'budget':profile[start+datetime.timedelta(day-1)]['budget'] })
23
24 def add_money(profile, topup, date=datetime.date.today()):
KeyError: datetime.date(2019, 1, 31)
我不明白為什么setdefault()
嘗試將默認值設置為datetime.date(2019, 2, 1)
如果該值已經存在。
我可以用if
來解決此問題,但我想了解setdefault
工作原理,也許對此問題有替代解決方案。
您誤解了錯誤。 KeyError
表示您試圖在字典中查找某個鍵,但是該鍵不存在。 在這種情況下, profile[start+datetime.timedelta(day-1)]
看起來像是給您KeyError
,與setdefault
方法調用無關。
考慮一下如何在不使用 setdefault
情況下編寫此代碼(以及一些較小的重構以提高可讀性):
def check_data(end, start, profile):
print(profile)
for day in range((end-start).days+1):
yesterday = start + datetime.timedelta(day - 1)
today = start + datetime.timedelta(day)
profile[today] = {
'expenditure': 0,
'top-up': 0,
'budget': profile[yesterday]['budget']
}
start = datetime.date(2019,2,1)
end = datetime.date(2019,2,17)
check_data(end, start, month_data)
在循環的第一次迭代中,您需要profile[datetime(2019,1,31)]
的值才能設置profile[datetime(2019,2,1)]
值,但從未設置過該值。
假設您可以從一些通用配置文件開始,則setdefault
的唯一用途是與yesterday
的密鑰一起使用。 為簡單起見,我假設budget
也是整數。
def check_data(end, start, profile):
print(profile)
for day in range((end-start).days+1):
yesterday = start + datetime.timedelta(day - 1)
today = start + datetime.timedelta(day)
profile[today] = {
'expenditure': 0,
'top-up': 0,
'budget': profile.setdefault(yesterday, {'budget': 0})['budget']
}
現在,如果profile[yesterday]
還不存在,則setdefault
將在返回該值之前執行profile[yesterday] = {'budget': 0}
的等效項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.