Нумерованный список в виде массива 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 они, конечно, упорядочены. Если синтаксический анализатор не выбрасывает эту информацию, вещи гораздо полезнее, например, для сравнения версий файла.