将文件加载到 yaml 时如何保持键的插入顺序?

use*_*510 3 python dictionary yaml pyyaml

我正在尝试将 YAML 用于 python 脚本。我编写的 YAML 文件类似于:

1:
  name: apple
  price: 5
3:
  name: orange
  price: 6
2:
  name: pear
  price: 2
Run Code Online (Sandbox Code Playgroud)

当我使用字典加载 YAML 文件时,yaml.load字典按键排序,因此它按 1、2、3 的顺序显示。如何维持1、3、2的顺序?

Ant*_*hon 5

在 YAML 规范中明确指出映射键没有顺序。然而,在一个文件中,他们有。如果您想要一种简单的方法来解决此问题,请将 PyYAML 替换为ruamel.yaml(免责声明:我是该包的作者,它是 PyYAML 的超集)并使用round_trip_load(),它将为您提供有序字典,而无需使用单个映射项的麻烦以“官方”方式指定有序字典所需的序列元素。

import ruamel.yaml

yaml_str = """\
1:
  name: apple
  price: 5
3:
  name: orange
  price: 6
2:
  name: pear
  price: 2
"""

data = ruamel.yaml.round_trip_load(yaml_str)
for key in data:
    print(key)
Run Code Online (Sandbox Code Playgroud)

给出

1
3
2
Run Code Online (Sandbox Code Playgroud)

1顺便说一句,PyYAML 不按键排序,排序只是计算哈希值和23python 中插入整数键的副作用dict