保持OrderedDict的顺序

时间:2018-12-31 22:29:18

标签: python python-3.x recursion ordereddict

我有一个要传递给函数的OrderedDict。在函数中的某处它会更改顺序,尽管我不确定为什么并正在尝试对其进行调试。这是该函数以及函数和输出的示例:

def unnest_data(data):
    path_prefix = ''
    UNNESTED = OrderedDict()
    list_of_subdata = [(data, ''),] # (data, prefix)
    while list_of_subdata:
        for subdata, path_prefix in list_of_subdata:
            for key, value in subdata.items():
                path = (path_prefix + '.' + key).lstrip('.').replace('.[', '[')
                if not (isinstance(value, (list, dict))):
                    UNNESTED[path] = value
                elif isinstance(value, dict):
                    list_of_subdata.append((value, path))
                elif isinstance(value, list):
                    list_of_subdata.extend([(_, path) for _ in value])
            list_of_subdata.remove((subdata, path_prefix))
        if not list_of_subdata: break
    return UNNESTED

然后,如果我叫它:

from collections import OrderedDict
data = OrderedDict([('Item', OrderedDict([('[@ID]', '288917'), ('Main', OrderedDict([('Platform', 'iTunes'), ('PlatformID', '353736518')])), ('Genres', OrderedDict([('Genre', [OrderedDict([('[@FacebookID]', '6003161475030'), ('Value', 'Comedy')]), OrderedDict([('[@FacebookID]', '6003172932634'), ('Value', 'TV-Show')])])]))]))])
unnest_data(data)                  

我得到了一个OrderedDict,它与我原来的顺序不匹配:

  

OrderedDict([('Item [@ID]','288917'),('Item.Genres.Genre [@FacebookID]',['6003172932634','6003161475030']))(('Item.Genres。 Genre.Value',['TV-Show','Comedy']),('Item.Main.Platform','iTunes'),('Item.Main.PlatformID','353736518')])

请注意它在“ PlatformID”之前如何具有“流派”,这与原始字典中的排序方式不同。此处似乎是我的错误,我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果没有完整的示例,很难确切地说出问题所在。但是根据您显示的代码,我怀疑您的问题根本不是OrderedDict,而是您在迭代过程中修改了list_of_subdata,这将导致项目意外跳过了。

>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> for x in a:
...     print(x)
...     a.remove(x)
... 
1
3
5
7

考虑到您的使用,请考虑使用deque而不是列表。