如何阻止OrderedDict插入元素而不是将其添加到结尾?

时间:2016-04-28 11:40:28

标签: python dictionary ordereddictionary

  

An OrderedDict is ordered by the order items are added to it.

为什么会发生这种情况?

我有两本词典:

d_names
d_new_names

第二个是第一个重新订购的版本。这是因为我理解I cannot re-order an existing OrderedDict - I need to create a new one

为此,我首先创建一个有序列表:

l_new_names = []
for s_number in d_names:
    for s_week_number in d_names[s_number]:
        l_new_names.append([s_number, s_week_number])

print "l_new_names before sort = %s" % l_new_names
l_new_names.sort()
print "l_new_names after sort = %s" % l_new_names

然后我创建并填充新词典的第一级:

d_new_names = ordereddict.OrderedDict()

for s_number, _ in l_new_names:
    if s_number in d_new_names:
        print "NOT creating d_new_names[%s]" % s_number
    else:
        print "creating d_new_names[%s]" % s_number
        d_new_names[s_number] = {}
        d_new_names[s_number][NAME] = d_names[s_number][NAME]

然后我创建第二级并填写字典:

for s_number, s_week_number in l_new_names:
    d_new_names[s_number][s_week_number] = {}
    d_new_names[s_number][s_week_number][DATE] = d_names[s_number][s_week_number][DATE]
    d_new_names[s_number][s_week_number][PRICE] = d_names[s_number][s_week_number][PRICE]

当我将字典内容写入文件时,我很惊讶地看到了这个顺序:

writing week:13
writing week:15
writing week:14
writing week:16

也就是说,第15周在第14周之前。

经过调查(每次通过第二个循环打印OrderedDict)我发现这个(数字对应循环):

  1. 第13周补充;订单:13
  2. 第14周补充说;订单:13,14
  3. 第15周补充;订单:13, 15 ,14
  4. 第16周补充;订单:13,15,14,16
  5. 结论:在创建和将元素插入OrderedDict 期间,元素的插入顺序错误。我认为这不可能。

    任何人都可以解释发生了什么以及如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

您正在将周数插入常规字典,而不是有序字典:

d_new_names[s_number] = {}

此处{@ 1}}位于有序字典中,因此d_new_names值按插入顺序保留,但键指的是普通字典。

然后您使用这些普通词典来存储每周信息:

s_number

因此,您的d_new_names[s_number][s_week_number] = {} 周数不按插入顺序保留,而是遵循普通字典的任意顺序。