如何防止 OrderedDict 插入元素而不是将其添加到末尾?
How can I prevent OrderedDict inserting an element rather than adding it to the end?
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 周之前。
经调查(每次通过 second 循环打印 OrderedDict)我发现了这个(数字对应于循环):
- 添加了第 13 周;顺序:13
- 添加了第 14 周;顺序:13、14
- 添加了第 15 周;订单: 13, 15, 14
- 添加了第 16 周;顺序:13、15、14、16
结论:在创建元素并将其插入 OrderedDict 期间,元素的插入顺序错误。我认为这是不可能的。
任何人都可以解释发生了什么以及我如何解决这个问题吗?
您正在将周数插入常规字典,而不是有序字典:
d_new_names[s_number] = {}
此处 d_new_names
在有序字典中,因此 s_number
值保持插入顺序,但键引用普通字典。
然后你用那些普通的字典来存储每周的信息:
d_new_names[s_number][s_week_number] = {}
您的 s_week_number
周数因此不会按插入顺序保存,而是遵循普通字典的任意顺序。
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 周之前。
经调查(每次通过 second 循环打印 OrderedDict)我发现了这个(数字对应于循环):
- 添加了第 13 周;顺序:13
- 添加了第 14 周;顺序:13、14
- 添加了第 15 周;订单: 13, 15, 14
- 添加了第 16 周;顺序:13、15、14、16
结论:在创建元素并将其插入 OrderedDict 期间,元素的插入顺序错误。我认为这是不可能的。
任何人都可以解释发生了什么以及我如何解决这个问题吗?
您正在将周数插入常规字典,而不是有序字典:
d_new_names[s_number] = {}
此处 d_new_names
在有序字典中,因此 s_number
值保持插入顺序,但键引用普通字典。
然后你用那些普通的字典来存储每周的信息:
d_new_names[s_number][s_week_number] = {}
您的 s_week_number
周数因此不会按插入顺序保存,而是遵循普通字典的任意顺序。