Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中具有特定顺序的OrderedDict_Python_Json_Dictionary - Fatal编程技术网

在Python中具有特定顺序的OrderedDict

在Python中具有特定顺序的OrderedDict,python,json,dictionary,Python,Json,Dictionary,我有一个字典,我正在发送给一个API,不幸的是,API要求字典的顺序非常具体。我正在从文件中加载词典 现在,json.load(fh,object\u pairs\u hook=OrderedDict)完全按照它应该做的做,并按字母顺序排列顶级键,但我需要对字典进行不同的排序 具体顺序: { "kind": "string", "apiVersion": "string", "metadata": {...}, "spec": { "subKey": "string"

我有一个字典,我正在发送给一个API,不幸的是,API要求字典的顺序非常具体。我正在从文件中加载词典

现在,
json.load(fh,object\u pairs\u hook=OrderedDict)
完全按照它应该做的做,并按字母顺序排列顶级键,但我需要对字典进行不同的排序

具体顺序:

{
  "kind": "string",
  "apiVersion": "string",
  "metadata": {...},
  "spec": {
    "subKey": "string"
  }
}

如何使用从文件加载的字典来指定顶级键和次级键的字典顺序?

在Python中,
OrderedDict
中的项目顺序与写入的顺序相同

因此,如果您想在创建
OrderedDict
时控制项目的顺序,您可以按照您想要的顺序写入它们。对于现有的
OrderedDict
,您可以按顺序读取、删除和回写每个项目

在您的示例中,如果需要调整项目的顺序,可以执行以下操作:

orders = ("kind", "apiVersion", "metadata", "spec")
for key in orders:
    v = object_pairs_hook[key]
    del object_pairs_hook[key]
    object_pairs_hook[key] = v

您不需要
objects\u pairs\u hook
在这种情况下,只需加载json文件并使用自定义排序从中创建
orderedict

SORT_ORDER = {
    "kind": 0,
    "apiVersion": 1,
    "metadata": 2,
    "spec": 3
}

d = json.load(fh)
d = OrderedDict(sorted(d.items(), key=lambda x: SORT_ORDER.get(x[0])))

说得好。你看完后知道如何按顺序写吗?你的问题有点让人困惑。尝试使用OrderedDict编写一些代码,如果遇到问题,可以用一个特定的问题发布。这非常糟糕,在本机Python中是O(N)。列表理解方法更好。JSON对象不应该被排序,因此您可能不应该使用
JSON
@chepner我没有选择,它必须被排序。