Python - 在 txt 文件中按升序排序

Python - Sorting in ascending order in a txt file

提问人:jaydh 提问时间:9/6/2014 更新时间:4/25/2016 访问量:631

问:

我有一个巨大的文档,我使用正则表达式解析它,以给出类似于以下内容的 txt 文件 (json.dump):

{
    "stuff": [
        {
            "name": [
                "frfer", 
                "niddsi", 
            ], 
            "number": 11300, 
            "identifier": "Tsdsad"
        }, 
        {
            "name": [
                "Fast", 
                "Guard", 
                "Named", 
            ], 
            "number": 117900, 
            "identifier": "Pdfms"
        }, 
        {
            name: [
                "Fast", 
            ], 
            "number": 660, 
            "identifier": "Unnamed"
        },    
    ]
}    

现在我想根据数字按升序对本文档进行排序。(即“Pdfms”在前,“Tsdsad”在后,“未命名”在后)。我不确定如何在 python 中开始,谁能给我一个正确方向的点?提前致谢

Python 排序

评论

0赞 GWW 9/6/2014
为什么不能使用 python 的 json 模块?
0赞 Jonathan Eunice 9/6/2014
至少有一个原因:这几乎是 JSON,但不完全是。至少,它需要升级为有效的 JSON,然后模块才能提供帮助。json

答:

2赞 Jonathan Eunice 9/6/2014 #1

第一个问题:这不是合法的 JSON。你在源代码中有额外的逗号(JSON不喜欢;它坚持),并且你有一些标识符(例如,的第三个实例)没有引用。理想情况下,您将改进初始文本文件解析和 JSON 化以解决这些问题。或者,您可以即时处理这些修复,如下所示:[a,b,c,][a,b,c]name

json_source = """
    ... your text data from above ...
"""

import re
BADCOMMA = re.compile(r',\s+\]')
json_source = BADCOMMA.sub(']', json_source)

BADIDENTIFIER = re.compile(r'\s+name:\s*')
json_source = BADIDENTIFIER.sub('"name":', json_source)

请注意,假设您可以即时解决所有可能的问题,这是一种脆弱的模式。同样,通过正则表达式编辑结构化数据文件。最好从一开始就生成好的 JSON。

现在,如何排序:

import json
data = json.loads(json_source)

data['stuff'].sort(key=lambda item: item['number'], reverse=True)

它通过“number”值对“stuff”数组进行就地排序,并将其反转(因为您希望输出方式的示例建议降序而不是典型的升序排序)。

为了证明排序已经完成了您想要的操作,该模块可以很方便:pprint

from pprint import pprint
pprint(data)

收益 率:

{u'stuff': [{u'identifier': u'Pdfms',
             u'name': [u'Fast', u'Guard', u'Named'],
             u'number': 117900},
            {u'identifier': u'Tsdsad',
             u'name': [u'frfer', u'niddsi'],
             u'number': 11300},
            {u'identifier': u'Unnamed', u'name': [u'Fast'], u'number': 660}]}