字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.
在保留元素顺序的同时,新字典实现如何比旧字典实现更好?
以下是文档中的文字:
dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)
2017年12月更新:Python 3.7 保证了dict保留插入顺序
我正在使用yaml.dump输出字典.它根据键按字母顺序打印出每个项目.
>>> d = {"z":0,"y":0,"x":0}
>>> yaml.dump( d, default_flow_style=False )
'x: 0\ny: 0\nz: 0\n'
Run Code Online (Sandbox Code Playgroud)
有没有办法控制键/值对的顺序?
在我的特定用例中,反向打印(巧合)就足够了.但是为了完整性,我正在寻找一个答案,展示如何更精确地控制订单.
我看过使用collections.OrderedDict但是PyYAML没有(似乎)支持它.我也看过子类化yaml.Dumper,但我无法弄清楚它是否有能力改变项目顺序.
我一直在阅读PyYAML源代码,试图了解如何定义一个我可以添加的正确的构造函数add_constructor.我对该代码现在的工作方式有了很好的理解,但我仍然不明白为什么默认的YAML构造函数SafeConstructor是生成器.例如,该方法construct_yaml_map的SafeConstructor:
def construct_yaml_map(self, node):
data = {}
yield data
value = self.construct_mapping(node)
data.update(value)
Run Code Online (Sandbox Code Playgroud)
我理解如何使用生成器BaseConstructor.construct_object如下所示来存根一个对象,并且仅使用来自节点的数据填充它,如果deep=False传递给construct_mapping:
if isinstance(data, types.GeneratorType):
generator = data
data = generator.next()
if self.deep_construct:
for dummy in generator:
pass
else:
self.state_generators.append(generator)
Run Code Online (Sandbox Code Playgroud)
我理解BaseConstructor.construct_document在deep=Falsefor 的情况下如何生成数据construct_mapping.
def construct_document(self, node):
data = self.construct_object(node)
while self.state_generators:
state_generators = self.state_generators
self.state_generators = []
for generator in state_generators:
for dummy in generator:
pass
Run Code Online (Sandbox Code Playgroud)
我不明白的是通过遍历生成器来截断数据对象和解决对象的好处construct_document …
我的问题很简单。我有一个带有自定义订单的 OrderredDict 对象,我想将其转换为 yaml 格式。但似乎 yaml.dump 不能将 Orderredict 作为输入。有谁知道怎么做?
我正在尝试读取 YAML 文件并按照文件中的顺序打印出其中的列表。
所以 YAML:
b: ...
a: ...
Run Code Online (Sandbox Code Playgroud)
我的蟒蛇是:
for key, value in yaml.load(open(input_file)).items():
print(str(key))
Run Code Online (Sandbox Code Playgroud)
输出变为:
a
b
Run Code Online (Sandbox Code Playgroud)
但我需要它是b那时a。我也尝试过iteritems(),得到了同样的结果。
我正在尝试将 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的顺序?
所以我有一个yaml文件,包含许多琐事问题和答案列表.但是,每当我尝试加载此文件并使用pyyaml将内容转储到python中时,它会向后转储它们.我不确定这是我的yaml文件还是我的库有问题.
假设我的一个问题/答案对在yaml文件中看起来像这样 -
{"question": "What is the name of this sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ...",
"answer": ["The Fibonacci Sequence", "The Padovan Sequence", "The Morris Sequence"]}
Run Code Online (Sandbox Code Playgroud)
当我在那个python字典上使用yaml.dump()时,它转储了这个 -
answer: [fibonacci, padovan, morris]\nquestion: 'what sequence is this: 1, 1, 2, 3, 5, 8, 13, ...'\n"
Run Code Online (Sandbox Code Playgroud)
我在期待这个 -
- question: "What is the name of this sequence of numbers: 1, 1, 2, 3, 5, 8, 13, ..."
answer: ["The Fibonacci Sequence", "The Padovan Sequence", "The Morris Sequence"] …Run Code Online (Sandbox Code Playgroud) python ×7
yaml ×6
pyyaml ×4
dictionary ×3
items ×1
iteritems ×1
python-3.6 ×1
python-3.x ×1
ruamel.yaml ×1