【问题标题】:Python sort json array keysPython排序json数组键
【发布时间】:2020-10-20 16:31:57
【问题描述】:

我有这个 json

{"1": {"ask": "232,40", "bid": "232,30", "name": "adidas AG"}, 
"10": {"ask": "8,314", "bid": "8,313", "name": "Deutsche Bank AG"}, 
"11": {"ask": "160,15", "bid": "160,10", "name": "Deutsche B\u00f6rse AG"}, 
"12": {"ask": "32,57", "bid": "32,56", "name": "Deutsche Post AG"}, 
"13": {"ask": "14,94", "bid": "14,935", "name": "Deutsche Telekom AG"}, 
"14": {"ask": "39,97", "bid": "39,96", "name": "Deutsche Wohnen SE"}, 
"15": {"ask": "10,115", "bid": "10,11", "name": "E.ON SE"}, 
"16": {"ask": "76,06", "bid": "76,04", "name": "Fresenius Medical Care KGaA"}, 
"17": {"ask": "43,87", "bid": "43,85", "name": "Fresenius SE & Co. KGaA"}, 
"18": {"ask": "47,66", "bid": "47,65", "name": "HeidelbergCement AG"}, 
"19": {"ask": "83,94", "bid": "83,92", "name": "Henkel AG & Co. KGaA VZ"}, 
"2": {"ask": "180,38", "bid": "180,36", "name": "Allianz SE"}, 
"20": {"ask": "20,80", "bid": "20,79", "name": "Infineon Technologies AG"}, 
"21": {"ask": "188,15", "bid": "188,10", "name": "Linde PLC"}, 
"22": {"ask": "103,20", "bid": "103,15", "name": "Merck KGaA"}, 
"23": {"ask": "155,35", "bid": "155,25", "name": "MTU Aero Engines AG"}, 
"24": {"ask": "228,20", "bid": "228,00", "name": "M\u00fcnchener R\u00fcckvers.-Ges. AG"}, 
"25": {"ask": "31,19", "bid": "31,18", "name": "RWE AG"}, 
"26": {"ask": "123,14", "bid": "123,10", "name": "SAP SE"}, 
"27": {"ask": "103,98", "bid": "103,96", "name": "Siemens AG"}, 
"28": {"ask": "134,36", "bid": "134,30", "name": "Volkswagen AG VZ"}, 
"29": {"ask": "55,14", "bid": "55,12", "name": "Vonovia SE"}, 
"3": {"ask": "49,95", "bid": "49,94", "name": "BASF SE"}, 
"30": {"ask": "5,36", "bid": "5,36", "name": "Wirecard AG"}, 
"4": {"ask": "66,14", "bid": "66,13", "name": "Bayer AG"}, 
"5": {"ask": "56,47", "bid": "56,46", "name": "Bayerische Motoren Werke AG"}, 
"6": {"ask": "101,65", "bid": "101,60", "name": "Beiersdorf AG"}, 
"7": {"ask": "87,52", "bid": "87,48", "name": "Continental AG"}, 
"8": {"ask": "34,25", "bid": "34,23", "name": "Covestro AG"}, 
"9": {"ask": "35,875", "bid": "35,87", "name": "Daimler AG"}, 
"datum": "30.06.2020", 
"zeit": "12:51:01"}

键的顺序错误。我想要 1,2,3... 的订单,我不想要 1,10,11....2,20...3,30... 等等。

我如何对这个 json 进行排序?我试过json.dumps(data, sort_keys=True),但这不是我想要的结果。

【问题讨论】:

  • JSON 中的键是字符串,它们是按字典顺序排序的。

标签: python json sorting


【解决方案1】:

您可以为键添加一些填充,以使它们按“数字”排序:

print(sorted(data.keys(), key=lambda key: key.zfill(2)))

输出:

['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', 'datum', 'zeit']

然后重新组装 json:

print(json.dumps(dict(sorted(data.items(), key=lambda item: item[0].zfill(2)))))

输出:

{"1": {"ask": "232,40", "bid": "232,30", "name": "adidas AG"}, "2": {"ask": "180,38", "bid": "180,36", "name": "Allianz SE"}, "3": {"ask": "49,95", "bid": "49,94", "name": "BASF SE"}...

【讨论】:

  • 这会在我的系统上产生随机结果。
  • 您使用的是哪个版本的 Python?如果删除 json.dumps() 会产生一致的结果吗?
  • 在 Python 3.4.2 下运行时(默认,2019 年 9 月 16 日,19:58:00)第一行产生正确的输出,您编写的第二行产生随机结果。在 Python 2.7.9 下运行时(默认,2019 年 9 月 16 日,18:29:54)没有随机结果,但它以索引“基准”(日期)开头,下一个索引为“24”等。python2 下的错误顺序和我的树莓派 2 上 python3 下的随机顺序
  • 好的,Python 3.6+ 字典维护键插入顺序,所以你所说的 3.4/2.7 是有道理的。我们可以试试这个:from collections import OrderedDict 并将我们对dict() 的调用替换为OrderedDict()print(json.dumps(OrderedDict(sorted(data.items(), key=lambda item: item[0].zfill(2)))))
  • Thx,这行得通,但同时我通过将索引转换为 int() 来解决它。我会尝试升级我的python版本:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多