首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保持字典顺序的同时迭代给定的字典

在保持字典顺序的同时迭代给定的字典
EN

Stack Overflow用户
提问于 2019-04-13 02:31:47
回答 2查看 39关注 0票数 0

我有一个嵌套的字典,其中有我想要的顺序。但是,当我试图迭代其中的项时,尝试递增一个键,在第一个for循环中,对象的顺序已经按字母顺序排序,就抛出了递增。

代码语言:javascript
运行
复制
given = {
    "testC": { "0": { "ccc": ["c100"] } },
    "testA": { "1": { "aaa": ["a100", "a200"] } }, 
    "testB": { "2": { "bbb": [] }}
}


index_order = 0

for k1, k2 in given.items(): # the ordering is change here, where testA will reordered
    for page_index_order in given[k1].keys():
        var = given[k1][page_index_order]

        if page_index_order != index_order:
            index_order += 1
        else:
            index_order = page_index_order

        given[k1][index_order] = var
        given[k1].pop(page_index_order)

pprint(given)

'''
{'testA': {1: {'aaa': ['a100', 'a200']}},
 'testB': {3: {'bbb': []}},
 'testC': {2: {'ccc': ['c100']}}}
'''

我希望我的结果是(排序相同,但请注意索引值,我希望testC为1,但它返回的是2):

代码语言:javascript
运行
复制
{'testC': {1: {'ccc': ['c100']}},
 'testA': {2: {'aaa': ['a100', 'a200']}},
 'testB': {3: {'bbb': []}}}

我尝试在第一个for循环中使用OrderedDict(given),但它返回一个排序字典。

EN

回答 2

Stack Overflow用户

发布于 2019-04-13 02:42:01

代码语言:javascript
运行
复制
given = {
    "testC": { "0": { "ccc": ["c100"] } },
    "testA": { "1": { "aaa": ["a100", "a200"] } }, 
    "testB": { "2": { "bbb": [] }}
}
given_keys = ["testC", "testA", "testB"]  # decide order
sorted_given = OrderedDict([(k, given[k]) for k in given_keys])
票数 0
EN

Stack Overflow用户

发布于 2019-04-13 03:06:09

如果您使用Python 3.7+或collections.OrderedDict,您的字典将被正确排序,但如果您在Python 3.7+中使用常规字典,问题将是pprint总是打印带有排序关键字的字典,没有不打印的选项。请改用print按实际顺序输出dict键:

代码语言:javascript
运行
复制
given = {
    "testC": { "0": { "ccc": ["c100"] } },
    "testA": { "1": { "aaa": ["a100", "a200"] } }, 
    "testB": { "2": { "bbb": [] }}
}

index_order = 0

for k1, k2 in given.items():
    for page_index_order in list(given[k1]):
        var = given[k1][page_index_order]

        if page_index_order != index_order:
            index_order += 1
        else:
            index_order = page_index_order

        given[k1][index_order] = var
        given[k1].pop(page_index_order)

print(given)

这将输出(在Python 3.7中):

代码语言:javascript
运行
复制
{'testC': {1: {'ccc': ['c100']}}, 'testA': {2: {'aaa': ['a100', 'a200']}}, 'testB': {3: {'bbb': []}}}

或使用collections.OrderedDict

代码语言:javascript
运行
复制
given = OrderedDict((
    ("testC", { "0": { "ccc": ["c100"] }}),
    ("testA", { "1": { "aaa": ["a100", "a200"] }} ),
    ("testB", { "2": { "bbb": [] }})
))

index_order = 0

for k1, k2 in given.items(): # the ordering is change here, where testA will reordered
    for page_index_order in list(given[k1]):
        var = given[k1][page_index_order]

        if page_index_order != index_order:
            index_order += 1
        else:
            index_order = page_index_order

        given[k1][index_order] = var
        given[k1].pop(page_index_order)

print(given)

这将输出以下内容:

代码语言:javascript
运行
复制
OrderedDict([('testC', {1: {'ccc': ['c100']}}), ('testA', {2: {'aaa': ['a100', 'a200']}}), ('testB', {3: {'bbb': []}})])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55657647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档