以JSON作为inpu生成排序嵌套字典

2024-09-26 18:05:30 发布

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

这是有效载荷

     payload = '''
{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": [
                {
                    "ID": "ABCD",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "PQRS",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "ABRA",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            ]
        }
    }
}

'''

将上面的这个json字符串作为输入并打印输出json,其中GlossList被排序(按ID排序)。你知道吗


Tags: idisolanguagemetastandardparamarkupgeneralized
3条回答

如果您只需要GlossList排序,请尝试在key中使用sortedlambda

例如:

print( sorted(payload["glossary"]["GlossDiv"]["GlossList"], key=lambda x: x["ID"]) )

输出:

[{'Abbrev': 'ISO 8879:1986',
  'Acronym': 'SGML',
  'GlossDef': {'GlossSeeAlso': ['GML', 'XML'],
               'para': 'A meta-markup language, used to create markup languages such as DocBook.'},
  'GlossSee': 'markup',
  'GlossTerm': 'Standard Generalized Markup Language',
  'ID': 'ABCD',
  'SortAs': 'SGML'},
 {'Abbrev': 'ISO 8879:1986',
  'Acronym': 'SGML',
  'GlossDef': {'GlossSeeAlso': ['GML', 'XML'],
               'para': 'A meta-markup language, used to create markup languages such as DocBook.'},
  'GlossSee': 'markup',
  'GlossTerm': 'Standard Generalized Markup Language',
  'ID': 'ABRA',
  'SortAs': 'SGML'},
 {'Abbrev': 'ISO 8879:1986',
  'Acronym': 'SGML',
  'GlossDef': {'GlossSeeAlso': ['GML', 'XML'],
               'para': 'A meta-markup language, used to create markup languages such as DocBook.'},
  'GlossSee': 'markup',
  'GlossTerm': 'Standard Generalized Markup Language',
  'ID': 'PQRS',
  'SortAs': 'SGML'},
 {'Abbrev': 'ISO 8879:1986',
  'Acronym': 'SGML',
  'GlossDef': {'GlossSeeAlso': ['GML', 'XML'],
               'para': 'A meta-markup language, used to create markup languages such as DocBook.'},
  'GlossSee': 'markup',
  'GlossTerm': 'Standard Generalized Markup Language',
  'ID': 'SGML',
  'SortAs': 'SGML'}]
>>> import json
>>> d = json.loads(payload)
>>> d['glossary']['GlossDiv']['GlossList'].sort(key=lambda x: x['ID'])
>>> print (json.dumps(d, indent=4))

输出

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": [
                {
                    "ID": "ABCD",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "ABRA",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "PQRS",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                },
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                }
            ]
        }
    }
}

首先,您提供的JSON无效。我已经编辑了你的答案,提供了一个有效的答案。你知道吗

回答您的问题:

  1. 必须使用ast.literal_eval()将字符串转换为字典。你知道吗
  2. 您可以申请:

    2.1 sorted函数,如果是这样,则必须构造原始字典,但这次排序。你知道吗

    2.2 sort方法

应用sorted函数

payload = ast.literal_eval(json_string)
sub_order_dict = sorted(payload["glossary"]["GlossDiv"]["GlossList"], key=lambda x: x["ID"])
d = {'glossary': {'title': 'example glossary',
     'GlossDiv': {'title': 'S',
           'GlossList': sub_order_dit}}}

应用sort方法

payload = ast.literal_eval(json_string)
payload["glossary"]["GlossDiv"]["GlossList"].sort(key=lambda x: x["ID"])

对于这两种情况,payload的输出是:

{'glossary': {'title': 'example glossary',
  'GlossDiv': {'title': 'S',
   'GlossList': [{'ID': 'ABCD',
     'SortAs': 'SGML',
     'GlossTerm': 'Standard Generalized Markup Language',
     'Acronym': 'SGML',
     'Abbrev': 'ISO 8879:1986',
     'GlossDef': {'para': 'A meta-markup language, used to create markup languages such as DocBook.',
      'GlossSeeAlso': ['GML', 'XML']},
     'GlossSee': 'markup'},
    {'ID': 'ABRA',
     'SortAs': 'SGML',
     'GlossTerm': 'Standard Generalized Markup Language',
     'Acronym': 'SGML',
     'Abbrev': 'ISO 8879:1986',
     'GlossDef': {'para': 'A meta-markup language, used to create markup languages such as DocBook.',
      'GlossSeeAlso': ['GML', 'XML']},
     'GlossSee': 'markup'},
    {'ID': 'PQRS',
     'SortAs': 'SGML',
     'GlossTerm': 'Standard Generalized Markup Language',
     'Acronym': 'SGML',
     'Abbrev': 'ISO 8879:1986',
     'GlossDef': {'para': 'A meta-markup language, used to create markup languages such as DocBook.',
      'GlossSeeAlso': ['GML', 'XML']},
     'GlossSee': 'markup'},
    {'ID': 'SGML',
     'SortAs': 'SGML',
     'GlossTerm': 'Standard Generalized Markup Language',
     'Acronym': 'SGML',
     'Abbrev': 'ISO 8879:1986',
     'GlossDef': {'para': 'A meta-markup language, used to create markup languages such as DocBook.',
      'GlossSeeAlso': ['GML', 'XML']},
     'GlossSee': 'markup'}]}}}

相关问题 更多 >

    热门问题