Может ли PyYAML сбрасывать элементы в не алфавитном порядке?

Я использую yaml.dump для вывода dict. Он печатает каждый элемент в алфавитном порядке на основе ключа.

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

Есть ли способ контролировать порядок пар ключ / значение?

В моем конкретном случае использования печать в обратном порядке (по совпадению) была бы достаточно хорошей. Для полноты, однако, я ищу ответ, который показывает, как более точно контролировать порядок.

Я посмотрел на использование collections.OrderedDict OderedDict, но PyYAML не поддерживает (кажется) поддержку. Я также посмотрел на yaml.Dumper , но я не смог выяснить, имеет ли он возможность изменять порядок предметов.

4 Solutions collect form web for “Может ли PyYAML сбрасывать элементы в не алфавитном порядке?”

Вероятно, есть лучший способ обхода проблемы, но я не мог найти ничего в документации или источнике.


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 .

Я также искал ответ на вопрос «как сбрасывать сопоставления с сохранением порядка?» Я не мог следовать приведенному выше решению, так как я новичок в pyyaml ​​и python. Проведя некоторое время на документации pyyaml ​​и других форумах, я нашел это.

Вы можете использовать тег

!! OMAP

сбрасывать отображения, сохраняя порядок. Если вы хотите играть с заказом, я думаю, вам нужно идти за ключами: значения

Следующие ссылки могут помочь лучше понять.

https://bitbucket.org/xi/pyyaml/issue/13/loading-and-then-dumping-an-omap-is-broken

http://yaml.org/type/omap.html

Вам нужно сделать две вещи, чтобы получить это, как вы хотите:

  • вам нужно использовать что-то другое, кроме dict , потому что оно не сохраняет упорядоченные элементы
  • вам необходимо соответствующим образом сбрасывать эту альтернативу .¹
 import sys import ruamel.yaml from ruamel.yaml.comments import CommentedMap d = CommentedMap() d['z'] = 0 d['y'] = 0 d['x'] = 0 ruamel.yaml.round_trip_dump(d, sys.stdout) 

вывод:

 z: 0 y: 0 x: 0 

¹ Это было сделано с использованием ruamel.yaml анализатора YAML 1.2, автором которого я являюсь.

Это действительно просто добавление к ответу Блендера. Если вы посмотрите в источнике PyYAML , в модуле representer.py , вы найдете этот метод:

 def represent_mapping(self, tag, mapping, flow_style=None): value = [] node = MappingNode(tag, value, flow_style=flow_style) if self.alias_key is not None: self.represented_objects[self.alias_key] = node best_style = True if hasattr(mapping, 'items'): mapping = mapping.items() mapping.sort() for item_key, item_value in mapping: node_key = self.represent_data(item_key) node_value = self.represent_data(item_value) if not (isinstance(node_key, ScalarNode) and not node_key.style): best_style = False if not (isinstance(node_value, ScalarNode) and not node_value.style): best_style = False value.append((node_key, node_value)) if flow_style is None: if self.default_flow_style is not None: node.flow_style = self.default_flow_style else: node.flow_style = best_style return node 

Если вы просто удалите строку mapping.sort() , то он сохранит порядок элементов в OrderedDict .

  • Yaml объединяется в Python
  • Как сохранить или прочитать литерал возврата каретки и новой строки из yaml в python
  • Как я могу обновить файл .yml, игнорируя существующий синтаксис Jinja, используя Python?
  • Есть ли обновленный быстрый парсер YAML с привязками python?
  • Python YAML: управление форматом вывода
  • python open () метод IOError: Нет такого файла или каталога:
  • Как предотвратить YAML для сбрасывания длинной строки без новой строки
  • Ошибки pyYAML в строке «!» в строке
  •  
    Interesting Posts for Van-Lav

    Параллелизм в Джулии. Особенности и ограничения

    Buildout пытается обновить общесистемную дистрибутивную установку и отказывается запускать

    Можно ли использовать DjExperExceptionReporterFilter с чем-то другим, чем AdminEmailHandler?

    i * должен * хранить учетные данные сторонних производителей в моей базе данных. лучший способ?

    Вход одиночного символа в Pydev / Eclipse

    Найти элемент с атрибутом с минидомом

    Как я могу заставить PyCharm распознавать статические файлы?

    Минимальное и максимальное из последних 1000 значений изменяющегося списка

    Почему результат numpy наименьших квадратов отклоняется от использования прямой формулы?

    нахождение самой длинной подстроки букв в алфавитном порядке в заданной строке

    Структура Django REST: AttributeError: объект Serializer не имеет атрибута 'Meta'

    array.shape (), дающий ошибку, не вызываемый

    Perl, как регулярное выражение в Python

    Какой самый быстрый способ снять и заменить документ с высокими символами Юникода с помощью Python?

    Как изменить dtype в TensorFlow для файла csv?

    Python - лучший язык программирования в мире.