在有序字典中,在键"foo"后面插入数据(原地操作)

8
我希望在给定的 OrdedDict 中插入一个键到另一个键的后面。
示例:
my_orderded_dict=OrderedDict([('one', 1), ('three', 3)])

我希望“'two' --> 2”能够放到正确的位置。
在我的情况下,我需要原地更新OrdedDict。
背景
Django的SortedDict(具有insert())被删除:https://code.djangoproject.com/wiki/SortedDict

8
另一个SO问题(https://dev59.com/kmQn5IYBdhLWcg3wpomp)没有处理“原地”更新。我认为我的问题不是重复的。 - guettli
1个回答

7
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

这个示例代码确实可以成功地在原地插入新项,但是代码的速度非常慢(正如@AshwiniChaudhary的答案所指出的那样),因为代码创建了一个新的collections.OrderedDict,然后对旧字典进行了clear操作,接着对旧的OrderedDict进行了update操作(清除旧字典和更新都很昂贵,因为清除涉及迭代和删除所有项,而更新涉及迭代旧/新并插入)。 - Trevor Boyd Smith
@TrevorBoydSmith,随意更新我的代码以提高性能。如果您不确定,请先向我写下您的想法。我会查看它。 - guettli
1
我已经给你的解决方案点了赞:)。我只是在警告那些可能不知道性能影响的未来人士。(“难以忍受的慢”部分不是你的实现问题。根据要求和有序字典的API,你的实现已经足够好了...所以再次强调,你的限制没有任何问题。) - Trevor Boyd Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接