簡體   English   中英

當值已經存在時使用dict.setdefault()

[英]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.

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