如何按主字典和子字典排序Python字典

2024-05-19 10:53:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,里面有国家和办事处,我需要按它们分类 国家然后按办公地点。通过这样做,我设法将它们按国家分类

sorted_list = [[id, desc] for id, desc in sorted(locations.items(), key=lambda item: (item[1]['name']))

然而,当我尝试执行项[1]['cities']['names']时,它不起作用,因为显然索引不是整数。你知道吗

(TypeError: list indices must be integers or slices, not str )

我要做的是先按国家排序,再按城市排序

预期产量

奥地利->;Gramatneusiedl/维也纳,内政部,Lenzing,Schoerfling,Weissenstein

比利时->;安特卫普,布鲁塞尔,内政部,奥斯滕德

初始输入

 locations = '2248': {
            'name': 'Austria',
            'cities': [{
                'OptionId': 2289,
                'name': 'Gramatneusiedl / Vienna'
            }, {
                'OptionId': 2290,
                'name': 'Lenzing'
            }, {
                'OptionId': 2291,
                'name': 'Schoerfling'
            }, {
                'OptionId': 2292,
                'name': 'Weissenstein'
            }, {
                'OptionId': 2293,
                'name': 'Home Office'
            }]
        },

    '2249': {
                'name': 'Belgium',
                'cities': [{
                    'OptionId': 9367,
                    'name': 'Oostende'
                }, {
                    'OptionId': 2294,
                    'name': 'Antwerp'
                }, {
                    'OptionId': 2295,
                    'name': 'Brussels'
                }, {
                    'OptionId': 2296,
                    'name': 'Home Office'
                }]

Tags: namegtid排序分类国家itemdesc
2条回答

你可以试试这个:

locations = {'2248': {'cities': [{'OptionId': 2289, 'name': 'Gramatneusiedl / Vienna'}, {'OptionId': 2290, 'name': 'Lenzing'}, {'OptionId': 2291, 'name': 'Schoerfling'}, {'OptionId': 2292, 'name': 'Weissenstein'}, {'OptionId': 2293, 'name': 'Home Office'}], 'name': 'Austria'}, '2249': {'cities': [{'OptionId': 9367, 'name': 'Oostende'}, {'OptionId': 2294, 'name': 'Antwerp'}, {'OptionId': 2295, 'name': 'Brussels'}, {'OptionId': 2296, 'name': 'Home Office'}], 'name': 'Belgium'}}
new_locations = {a:{c:d if isinstance(d, str) else sorted(d, key=lambda x:x['name']) for c, d in b.items()} for a, b in locations.items()}

输出:

{'2248': {'cities': [{'OptionId': 2289, 'name': 'Gramatneusiedl / Vienna'}, {'OptionId': 2293, 'name': 'Home Office'}, {'OptionId': 2290, 'name': 'Lenzing'}, {'OptionId': 2291, 'name': 'Schoerfling'}, {'OptionId': 2292, 'name': 'Weissenstein'}], 'name': 'Austria'}, '2249': {'cities': [{'OptionId': 2294, 'name': 'Antwerp'}, {'OptionId': 2295, 'name': 'Brussels'}, {'OptionId': 2296, 'name': 'Home Office'}, {'OptionId': 9367, 'name': 'Oostende'}], 'name': 'Belgium'}}

编辑:Python字典本来就是未排序的,但是,您可以使用collections.OrderedDict来补偿:

from collections import OrderedDict
new_locations = OrderedDict()
final_data = sorted(locations.items(), key=lambda x:x[-1]['name'])
for a, b in final_data:
   new_locations[a] = {'name':b['name'], 'cities':sorted(b['cities'], key=lambda x:x['name'])}

输出:

OrderedDict([('2248', {'cities': [{'OptionId': 2289, 'name': 'Gramatneusiedl / Vienna'}, {'OptionId': 2293, 'name': 'Home Office'}, {'OptionId': 2290, 'name': 'Lenzing'}, {'OptionId': 2291, 'name': 'Schoerfling'}, {'OptionId': 2292, 'name': 'Weissenstein'}], 'name': 'Austria'}), ('2249', {'cities': [{'OptionId': 2294, 'name': 'Antwerp'}, {'OptionId': 2295, 'name': 'Brussels'}, {'OptionId': 2296, 'name': 'Home Office'}, {'OptionId': 9367, 'name': 'Oostende'}], 'name': 'Belgium'})])

Python中的字典键不保证顺序。你可以看到这篇关于更多细节的文章:Python dictionary, how to keep keys/values in same order as declared?。有很多方法可以做到这一点,根据您使用的Python版本的不同,可能会有所不同。你知道吗

如果您只想按顺序打印项目,有一种简单的方法可以使用json库来管理它。你知道吗

import json
ordered = {v['name']: sorted([i['name'] for i in v['cities']]) for v in locations.values()}
json.dumps(ordered, sort_keys=True)

这将打印以下结果:

{
  "Austria": [
    "Gramatneusiedl / Vienna",
    "Home Office",
    "Lenzing",
    "Schoerfling",
    "Weissenstein"
  ],
  "Belgium": [
    "Antwerp",
    "Brussels",
    "Home Office",
    "Oostende"
  ]
}

如果要保持字典中的顺序,请使用OrderedDict对象。有序图片记住插入顺序。因此,在创建最终字典之前,我们可以根据name键的值对所有项进行排序。你知道吗

from collections import OrderedDict
ordered = OrderedDict()
# sort each dictionary by their name field
sorted_by_country = sorted(locations.values(), key = lambda x:x['name'])
for v in sorted_by_country:
    ordered[v['name']] = sorted([i['name'] for i in v['cities']])

相关问题 更多 >

    热门问题