Нумерованный список в виде массива YAML

Вместо

key:
    - thisvalue
    - thatvalue
    - anothervalue

Я бы хотел

key:
    1. thisvalue
    2. thatvalue
    3. anothervalue

исключительно для удобства чтения, с той же интерпретацией {key: [thisvalue, thatvalue, anothervalue]},

Похоже, это не является частью основного синтаксиса YAML, но есть ли способ достичь этого - возможно, с использованием некоторых расширенных возможностей, возможных в YAML?

(Я понимаю, что это можно приблизить, написав список следующим образом:

key:
    - 1. thisvalue
    - 2. thatvalue
    - 3. anothervalue

но это уродливый хак, и я бы предпочел решение, в котором числа имели семантическое назначение, а не просто часть текста значения, которое также требует анализа и удаления.)

2 ответа

Решение

Нет способа сделать это в YAML. Однако вы можете использовать обычное вложение элементов, а затем во время синтаксического анализа генерировать массив / список / словарь на основе этих:

my_numbered_pseudo_list:
  1: a
  2: b
  3: c
  ...
  n: x

При загрузке приведенного выше примера вы получите словарь с ключом "my_numbered_pseudo_list" и его значение в виде словаря, содержащего все вложенные пары. {"1" : "a", "2" : "b", ..., "n" : "x"}, Вот пример того, как это будет выглядеть:

import yaml

doc = '''
list:
  1: a
  2: b
  3: c
  4: d
'''

y = yaml.load(doc);
list = []

for i in y['list']:
    list.append(y['list'].get(i))

print list

Это даст вам

['a', 'b', 'c', 'd']

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

Я также видел, как люди используют упорядоченные хэш-вызовы в результирующем словаре (здесь: "список") (например, в Ruby, с которым я не знаком), так что вы можете захотеть еще немного покопаться.

ВАЖНЫЙ!

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

При использовании Python для сохранения порядка ключей в сопоставлениях YAML (и комментариях, именах привязок и т. Д.) Сопоставления считываются в специальные производные orderdict, если вы используете ruamel.yaml (diclaimer: я автор) и RoundTripLoader.

Они работают прозрачно, но с этим, и используя синтаксис, предложенный rbaleksandar в ее / его ответе, вы можете просто сделать:

import ruamel.yaml as yaml

yaml_str = """\
key:
    1: thisvalue
    2: thatvalue
    3: anothervalue
    4: abc
    5: def
    6: ghi
"""

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
y = data['key']
print y.keys()[2:5]
print y.values()[2:5]
print y.items()[2:5]

получить:

[3, 4, 5]
['anothervalue', 'abc', 'def']
[(3, 'anothervalue'), (4, 'abc'), (5, 'def')]

без особых усилий после загрузки данных.

В спецификации YAML указано, что порядок ключей не гарантирован, но в файле YAML они, конечно, упорядочены. Если синтаксический анализатор не выбрасывает эту информацию, вещи гораздо полезнее, например, для сравнения версий файла.

Другие вопросы по тегам