簡體   English   中英

如果 dict 中的鍵不存在,Python 會更新它

[英]Python update a key in dict if it doesn't exist

如果鍵不在 dict.keys() 中,我想將鍵值對插入到 dict 中。 基本上我可以這樣做:

if key not in d.keys():
    d[key] = value

但是有更好的方法嗎? 或者這個問題的pythonic解決方案是什么?

你不需要調用d.keys() ,所以

if key not in d:
    d[key] = value

足夠。 沒有更清晰、更易讀的方法。

您可以使用dict.get()再次更新,如果鍵已經存在,它將返回一個現有值:

d[key] = d.get(key, value)

但我強烈建議不要這樣做; 這是代碼打高爾夫球,阻礙了維護和可讀性。

使用dict.setdefault()

>>> d = {'key1': 'one'}
>>> d.setdefault('key1', 'some-unused-value')
'one'
>>> d    # d has not changed because the key already existed
{'key1': 'one'}
>>> d.setdefault('key2', 'two')
'two'
>>> d
{'key1': 'one', 'key2': 'two'}

Python 3.9 開始,您可以使用合並運算符| 合並兩個字典。 右邊的 dict 優先:

new_dict = old_dict | { key: val }

例如:

new_dict = { 'a': 1, 'b': 2 } | { 'b': 42 }

print(new_dict) # {'a': 1, 'b': 42}

注意:這將創建一個包含更新值的新字典。

使用以下內容,您可以插入多個值並具有默認值,但您正在創建一個新字典。

d = {**{ key: value }, **default_values}

我已經用投票最多的答案對其進行了測試,平均而言這更快,如下例所示。

速度測試將基於 for 循環的方法與具有解包運算符的 dict 理解進行比較 將基於 for 循環的方法與具有解包運算符方法的 dict 理解進行比較的速度測試。

如果在第一種情況下沒有復制( d = default_vals.copy() ),那么一旦我們達到10**5和更大的數量級,投票最多的答案就會更快。 兩種方法的內存占用是相同的。

根據上面的答案setdefault()方法對我有用

old_attr_name = mydict.setdefault(key, attr_name)
if attr_name != old_attr_name:
    raise RuntimeError(f"Key '{key}' duplication: "
                       f"'{old_attr_name}' and '{attr_name}'.")

雖然這個解決方案不是通用的。 在這種特定情況下適合我。 確切的解決方案是首先檢查key (正如已經建議的那樣),但是使用setdefault()我們避免了對字典的額外查找,也就是說,雖然很小,但仍然可以提高性能。

您也可以僅在一行代碼中使用此解決方案:

dict[dict_key] = dict.get(dict_key,value)

dict.get的第二個參數是在鍵不存在的情況下要分配給鍵的值。 由於這在分配給dict[dict_key] =之前進行了評估,因此我們可以確定當我們嘗試訪問它們時它們的鍵將存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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