2015-03-25 51 views
4

我想在OrdedDict的某個給定鑰匙後面插入鑰匙。插入鑰匙「foo」後面的OrderedDict(inplace)

例子:

my_orderded_dict=OrderedDict([('one', 1), ('three', 3)]) 

我想'two' --> 2進入正確的位置。

就我而言,我需要在原地更新OrdedDict

背景

的Django的SortedDict(其具有insert())獲取刪除:https://code.djangoproject.com/wiki/SortedDict

+7

另一個SO問題(http://stackoverflow.com/questions/16664874/how-can -i-add-the-the-top-of-ordered-top-of-python)不處理'in place'更新。我不認爲我的問題是重複的。 – guettli 2015-03-25 08:19:15

回答

5
from collections import OrderedDict # SortedDict of Django gets removed: https://code.djangoproject.com/wiki/SortedDict 

my_orderded_dict=OrderedDict([('one', 1), ('three', 3)]) 

new_orderded_dict=my_orderded_dict.__class__() 
for key, value in my_orderded_dict.items(): 
    new_orderded_dict[key]=value 
    if key=='one': 
     new_orderded_dict['two']=2 
my_orderded_dict.clear() 
my_orderded_dict.update(new_orderded_dict) 
print my_orderded_dict 
+0

此示例代碼確實可以在原地插入新項目,但代碼速度過於緩慢([由@ AshwiniChaudhary的回答指出](https://stackoverflow.com/a/16664932/52074)),因爲代碼會創建一個新的'collections.OrderedDict',然後在舊字典上執行'clear',然後在舊的'OrderedDict'上執行'update'(清除舊的字典並且更新代價昂貴,因爲清除包括迭代和刪除所有項目。它涉及重複舊/新和插入)。 – 2017-06-07 14:04:56

+0

@TrevorBoydSmith隨時更新我的​​代碼以提高性能。如果你不確定,請先寫下你的想法。我會看看它。 – guettli 2017-06-07 15:40:13

+0

我upvoted你的解決方案:)。我只是警告毫無戒心的將來可能不會意識到性能影響的人。 (「非常慢」的部分不是你的實現,根據需求和有序的字典API,你的實現已經足夠好了......所以你的限制再次沒有錯。) – 2017-06-07 19:12:06