[英]What is the most efficient way to add keys with empty values to dictionary?
我使用ordered_set = dict()
創建有序集。 這些值並不重要。 僅測試是否已添加密鑰。 有序集是一組唯一值,其中保持添加順序。
if node not in ordered_set:
ordered_set[node] = None # ordered_set[node] = False or ordered_set[node] = '' or ordered_set[node] = 0
f1()
else:
f2()
將具有空值的鍵添加到字典的最有效方法是什么? 也許有更好的方法來實現有序集?
這是一種方法。 在更高版本的 Python(我認為是 3.6+)中,保留了將鍵添加到字典的順序(在早期版本的 Python 中無法保證字典中鍵的順序)。
方法.setdefault()
內置在 Python 字典中,專為您面臨的用例而設計:檢查是否存在密鑰,如果不存在,則創建密鑰並設置默認值。
mydict = {1: True, 2:True, 5: True}
for key in [1, 2, 3, 4, 5]:
mydict.setdefault(key, None)
產量
{1: True, 2: True, 5: True, 3: None, 4: None}
在上面,請注意保持鍵的順序......前三個鍵已經存在,其他鍵(3 和 4)按特定順序添加並保持順序。
因為.setdefault()
的默認行為是自動將新鍵設置為None
,所以我們可以這樣簡化代碼:
for key in [1, 2, 3, 4, 5]:
mydict.setdefault(key)
其中一條評論提出了一個關於“效率”的重要觀點並且不會說謊,我的方法旨在提高開發人員的效率(即使用內置工具來保持代碼更短、更簡單、更容易理解)。 但是,讓我們看看在代碼效率(即計算時間)方面發生了什么:
這是一個簡單的基准,顯示了計算的相對速度。 我們首先制作mydict
和具有更多條目的mylist
版本,其中大部分不會出現在 dict 中。
In [26]: %%timeit mydict = {1: True, 2:True}; mylist = list(range(1000000))
...: for key in mylist:
...: if key not in mydict:
...: mydict[key] = None
...:
29.6 ms ± 613 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [28]: %%timeit mydict = {1: True, 2:True}; mylist = list(range(1000000))
...: for key in mylist:
...: mydict.setdefault(key)
...:
49.8 ms ± 715 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
我們看到,對於首先測試mydict
中是否存在密鑰的代碼,我們完成的時間更短。 如果我們使用內置方法.setdefault()
我們會看到更長的時間來完成(可能是因為 function 調用可能很昂貴)。
因此,就計算的原始時間而言,原始發布者的方法在時間方面似乎更有效,並且某些人可能認為使用內置的.setdefault()
在開發人員的時間/精力方面更有效。 YMMV。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.