【问题标题】:Unintentional random order in a list [duplicate]列表中的无意随机顺序[重复]
【发布时间】:2019-11-09 03:09:34
【问题描述】:

我正在尝试使用 JSON 对象的数据构建一个列表。但是列表的顺序与 JSON 对象的顺序不匹配,并且几乎每次我运行代码时都会发生变化。

{
    "project":{
        "Projektnamen":{
            "Server":{
                "Server1":{
                    ...
                },
                "Server2":{
                    ...
                },
                "Server3":{
                    ...
                }
            }
        }
    }
}
with open('json_data.json') as json_file:
    # json CONFIG_JSON Konfigurationsdatei
    CONFIG_JSON = json.load(json_file)

for key in CONFIG_JSON["project"]["Projektnamen"]["Server"]:
    servernamen.append(key)

预期结果:servernamen = [Server1, Server2, Server3]

但是顺序总是会改变。 最后结果:servernamen = [Server3, Server1, Server2]

【问题讨论】:

  • 可能在 Python 3.6 数组(或者更确切地说是字典)之前不必保持顺序。如果您需要订单,最好将其保留为列表。
  • 字典不保证顺序。
  • @TheScientificMethod 该信息已过时。请参阅 stackoverflow.com/a/47881325/4014959 OTOH,JSON 规范不要求 {} 对象保留顺序,因此通常拥有期望它们保留顺序的数据流。

标签: python list


【解决方案1】:

您可以导入已使用collections.OrderedDictjson.load 的参数排序的JSON 数据:

from collections import OrderedDict
import json


r = json.load(open('json_data.json'), object_pairs_hook=OrderedDict)

【讨论】:

    【解决方案2】:

    json.loads 将 JSON 反序列化为字典对象,这是一个无序的哈希表。

    您可以使用collections 中的OrderedDict 对键进行排序。 示例

    from collections import OrderedDict
    
    d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
    new_d = OrderedDict(sorted(d.items()))
    
    print(new_d)
    # OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
    

    【讨论】:

    • 有没有办法按顺序加载JSON?
    • 响应中添加的解决方案
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多