【问题标题】:How to print sorted data on json.load?如何在 json.load 上打印排序数据?
【发布时间】:2016-11-29 14:10:10
【问题描述】:

我需要逐行打印静态 json 文件。我想在打印之前按键值对其进行排序。我查看了有关 stackoverflow 的其他几个示例,但无法找到解决此特定问题的方法。

到目前为止,我的代码如下所示:

import json
from pprint import pprint
with open('items.json') as data_file:
    data = json.load(data_file)
    for line in data:
        pprint(data)

我的 json 看起来像这样:

[
{"version": ["2.8.2"], "license": ["GPL"]},
{"version": ["1.8.8"], "license": ["MIT/X11 License"]},
{"version": ["2.8.5"], "license": ["GPL"]},
{"version": ["1.8.9"], "license": ["MIT/X11 License"]}
]

如何在保留顺序的同时按“版本”等键值对其进行排序? 通过这种方式,我可以确定在哪个版本更改了许可证。

所需的输出如下所示:

[
{"version": ["1.8.8"], "license": ["MIT/X11 License"]},
{"version": ["1.8.9"], "license": ["MIT/X11 License"]},
{"version": ["2.8.2"], "license": ["GPL"]},
{"version": ["2.8.5"], "license": ["GPL"]}
]

谢谢。

【问题讨论】:

  • for line in data: pprint(data) 永远不会提供您想要的输出,所以我必须澄清一下,您是希望获得有效的 JSON 作为输出,还是只是想要一些排序和漂亮的东西?
  • 在这种情况下只是排序和漂亮。

标签: python json sorting


【解决方案1】:

您只需要使用适当的键功能对您的字典列表进行排序。您可以使用 lambda,但itemgetter 更有效。

import json
from pprint import pprint
from operator import itemgetter

data_str = '''\
[
    {"version": ["2.8.2"], "license": ["GPL"]},
    {"version": ["1.8.8"], "license": ["MIT/X11 License"]},
    {"version": ["2.8.5"], "license": ["GPL"]},
    {"version": ["1.8.9"], "license": ["MIT/X11 License"]}
]
'''

data = json.loads(data_str)
data.sort(key=itemgetter("version"))
pprint(data)

输出

[   {'license': ['MIT/X11 License'], 'version': ['1.8.8']},
    {'license': ['MIT/X11 License'], 'version': ['1.8.9']},
    {'license': ['GPL'], 'version': ['2.8.2']},
    {'license': ['GPL'], 'version': ['2.8.5']}]

【讨论】:

  • 感谢您提供解决方案!我不是在处理大型数据集,但我假设您的效率是指 itemgetter 比 lambda 更快?
  • @tonemgub 是的,itemgetter 比使用等效的 lambda 更快,但了解这两种方式很好,因为有时您需要一个比 itemgetter 可以做的更多的关键函数。
【解决方案2】:

看起来数据已经是字典形式了,所以类似于:

sorted_data = sorted(data, key = lambda x: x['version'])

然后漂亮地打印该结构。

编辑:你可以用一行打印整个结构,顺便说一句:

pprint.pprint(sorted_data, indent=4)

应该很好看。

有关 lambda 表达式的更多信息,请查看此 SO 线程:What is key=lambda

【讨论】:

  • 是的,这正是我想要的。我将阅读有关 lamda 函数的更多信息。感谢您的帮助!
  • @tonemgub 很高兴为您提供帮助!我添加了一个链接,指向使用 lambda 的一个很好的总结。不要忘记接受你最喜欢的答案(我看到还有一个也很好)
猜你喜欢
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2021-12-09
相关资源
最近更新 更多