当前位置: 首页 > 面试题库 >

PyYAML可以非字母顺序转储字典项吗?

拓拔飞飙
2023-03-14
问题内容

yaml.dump用来输出字典。它根据键以字母顺序打印出每个项目。

>>> d = {"z":0,"y":0,"x":0}
>>> yaml.dump( d, default_flow_style=False )
'x: 0\ny: 0\nz: 0\n'

有没有办法控制键/值对的顺序?

在我的特定用例中,反向打印(碰巧)就足够了。为了完整起见,我正在寻找一个答案,该答案显示了如何更精确地控制订单。

我已经看过使用,collections.OrderedDict但是PyYAML不支持(似乎)。我还研究了子类化yaml.Dumper,但是我无法弄清它是否具有更改项目顺序的能力。


问题答案:

可能有更好的解决方法,但是我在文档或源代码中找不到任何内容。

Python 2(查看评论)

我将其分类OrderedDict,并使其返回无法排序的项目的列表:

from collections import OrderedDict

class UnsortableList(list):
    def sort(self, *args, **kwargs):
        pass

class UnsortableOrderedDict(OrderedDict):
    def items(self, *args, **kwargs):
        return UnsortableList(OrderedDict.items(self, *args, **kwargs))

yaml.add_representer(UnsortableOrderedDict, yaml.representer.SafeRepresenter.represent_dict)

它似乎起作用:

>>> d = UnsortableOrderedDict([
...     ('z', 0),
...     ('y', 0),
...     ('x', 0)
... ])
>>> yaml.dump(d, default_flow_style=False)
'z: 0\ny: 0\nx: 0\n'

Python 3或2(请参阅注释)

您还可以编写一个自定义表示符,但是我不知道以后是否会遇到问题,因为我从中剥离了一些样式检查代码

import yaml

from collections import OrderedDict

def represent_ordereddict(dumper, data):
    value = []

    for item_key, item_value in data.items():
        node_key = dumper.represent_data(item_key)
        node_value = dumper.represent_data(item_value)

        value.append((node_key, node_value))

    return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value)

yaml.add_representer(OrderedDict, represent_ordereddict)

但是,您可以使用本机OrderedDict类。



 类似资料:
  • 考虑这个例子,从0到10颠倒数字的顺序:<代码> 这以一种双重的方式颠倒了顺序。如果我输入100个从0到10的数字,它包含a 对于字典顺序,我需要同样的东西。我有一根固定长度为10的绳子。如何颠倒字典顺序? 如果它只包含,这将非常简单。但是它也可以包含数字和,并且区分大小写。 有人知道怎么做吗?

  • 问题内容: 我经常使用python处理数据目录。最近,我注意到列表的默认顺序已更改为几乎毫无意义的内容。例如,如果我位于包含以下子目录的当前目录中:run01,run02,…,run19,run20,然后从以下命令生成列表: 然后我通常会按以下顺序获得列表: 等等。顺序曾经是字母数字。但是这个新订单已经存在了一段时间。 是什么决定这些列表的(显示)顺序? 问题答案: 我认为顺序与文件在FileSy

  • 在 FreeMarker 2.3.23 中,指令名可以使用驼峰样式来代替蛇形样式, 比如 startsWith 代替 starts_with。 但是要知道,在相同模版内,FreeMarker 会强制对模板语言部分的所有标识符使用驼峰样式 (用户自定义名称不会受影响)。 abs ancestors api boolean byte c for strings, for booleans cap_fi

  • $ ${...},  插值 # #,  总体结构, 指令 #{...},  #{...}: 数字插值 < <#...>,  指令 <#--...-->,  总体结构 A ABC,  lower_abc, upper_abc abs built-in,  abs absolute value,  abs acquisition,  使用获得机制 adding hashes,  连接 adding s

  • 问题内容: 我在mysql排序中寻找一些调整,我通常从表中选择记录,然后按Name(varchar)ASC排序记录, 但编号始终是第一位的 这是我的问题的一些示例( 注意。mysql首先用0-9排序记录 ) 我想要的是字母顺序,然后是数字 所需的输出 问题答案: 使用以下子句:

  • 问题内容: 我是Java的新手,正在尝试按字母顺序排列术语的arrayList。(一个术语定义为一个字符和一个整数)(例如 我的代码如下: 为什么这不起作用?以及我该如何完成呢?我的arrayList称为术语,填充有Term类型 问题答案: 您在这行代码中遇到的问题。您的课程不是So 的类型,这两个对象将基于哪个属性或条件方法? 您必须使您的类为Comparable类型。和,根据您的需要覆盖该方法