簡體   English   中英

將具有空值的鍵添加到字典的最有效方法是什么?

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

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