Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何防止OrderedDict插入元素而不是将其添加到末尾?_Python_Dictionary_Ordereddictionary - Fatal编程技术网

Python 如何防止OrderedDict插入元素而不是将其添加到末尾?

Python 如何防止OrderedDict插入元素而不是将其添加到末尾?,python,dictionary,ordereddictionary,Python,Dictionary,Ordereddictionary,那么为什么会发生这种情况呢 我有两本字典: d_names d_new_names 第二个是第一个的重新排序版本。这是因为我明白这一点 为此,我首先创建一个有序列表: 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 befor

那么为什么会发生这种情况呢

我有两本字典:

d_names
d_new_names
第二个是第一个的重新排序版本。这是因为我明白这一点

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

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]
d_new_names[s_number] = {}
然后我创建第二级并填充字典:

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]
d_new_names[s_number] = {}
当我将词典内容写入一个文件时,我惊讶地看到以下顺序:

writing week:13
writing week:15
writing week:14
writing week:16
也就是说,第15周先于第14周

经过调查(每次通过第二个循环打印OrderedDict),我发现(编号对应于循环):

  • 增加第13周;订单:13
  • 第14周增加;订单:13、14
  • 第15周增加;顺序:13,15,14
  • 第16周增加;顺序:13、15、14、16
  • 结论:在创建元素并将其插入OrderedICT的过程中,元素的插入顺序错误。我认为那是不可能的


    有人能解释一下发生了什么以及我是如何解决的吗?

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

    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]
    
    d_new_names[s_number] = {}
    
    这里,
    d\u新的\u名称
    在一个有序字典中,因此
    s\u编号
    值按插入顺序保留,但键引用普通字典

    然后,使用这些普通字典存储每周信息:

    d_new_names[s_number][s_week_number] = {}
    

    因此,您的
    s\u week\u编号
    周编号不会按插入顺序保存,而是按照普通字典的任意顺序进行。

    请发布示例数据以运行代码。这段代码不是复制问题的最小完整代码,而是其他错误的代码;有序字典非常保持原始的插入顺序。就是这样!我将您引用的两行代码改为:
    d_new_names[s_po_number]=ordereddict.ordereddict()
    d_new_names[s_po_number][s_week_number]=ordereddict.ordereddict()
    ,现在可以使用了,非常感谢。(从一个问题到另一个解决方案需要6分钟——我的一个问题是我见过的最好的一个问题!:)[我自己不会找到这个,干杯!]@Wikis如果你包括一个完整的MCVE,我肯定会成功的。:-)