Comment fusionner les tableaux YAML?
some_stuff: &some_stuff
- a
- b
- c
combined_stuff:
<<: *some_stuff
- d
- e
- f
j'aimerais avoir le combiné de tableau [a,b,c,d,e,f]
je reçois l'erreur: n'a pas trouvé la clé attendue lors de l'analyse d'un bloc
comment fusionner des tableaux dans YAML?
3 réponses
Contexte
Ce post suppose le contexte suivant:
- python 2.7
- Python YAML parser
Problème
lfender6445 souhaite fusionner deux ou plusieurs listes dans un fichier YAML, et avoir les listes fusionnées apparaissent comme une liste unique lorsqu'elles sont analysées.
Solution
cela peut être obtenu simplement en assignant des ancrages YAML à des mappages, où
les listes souhaitées apparaissent comme des éléments enfants de cartographie. Dans l'exemple ci-dessous
nous avons trois mappages (list_one, list_two, list_three
) et trois ancres
et des pseudonymes qui renvoient à ces correspondances, le cas échéant.
lorsque le fichier YAML est chargé dans le programme, nous obtenons la liste que nous voulons, mais il peut nécessiter un peu de modification après la charge (voir les pièges ci-dessous).
Exemple
fichier YAML Original
list_one: &id001 - a - b - c list_two: &id002 - e - f - g list_three: &id003 - h - i - j list_combined: - *id001 - *id002 - *id003
résultat après YAML.safe_load
## list_combined [ [ "a", "b", "c" ], [ "e", "f", "g" ], [ "h", "i", "j" ] ]
Pièges
- ce approach produit une liste imbriquée de listes, qui peut ne pas être la sortie désirée exacte, mais cela peut être post-traité en utilisant le aplatir l' méthode
- mises en garde habituelles de YAML des ancres et des alias demander l'unicité et l'ordonnance de déclaration
Conclusion
cette approche permet la création de listes fusionnées en utilisant les fonctionnalités alias et anchor de YAML.
Bien que le résultat de sortie est une liste imbriquée de listes, cela peut être facilement transformé en utilisant le flatten
méthode.
Voir aussi
- Ruby
flatten
;; http://ruby-doc.org/core-2.2.2/Array.html#method-i-flatten - Python
flatten
;; https://softwareengineering.stackexchange.com/a/254676/23884
Ce n'est pas d'aller travailler:
- fusionner est uniquement pris en charge par le YAML spécifications pour les mappages et pas pour les séquences
- vous mélangez complètement les choses en ayant une touche de fusion
<<
suivi du séparateur clé/valeur:
et une valeur de référence et puis continuer avec une liste au même niveau d'indentation
Ce n'est pas correct YAML:
combine_stuff:
x: 1
- a
- b
donc votre syntaxe d'exemple ne serait même pas faites sens en tant que proposition D'extension YAML.
si vous voulez faire quelque chose comme ça, essayez de faire la valeur pour combined_stuff
un type spécial que vous spécifiez avec une étiquette YAML, de sorte que l'objet instancié pour ce type sache interpréter les éléments et remplacer cet élément par tous ceux de some_stuff
.
Vous pouvez fusionner les mappings puis convertir leurs clés en une liste, dans ces conditions:
- si vous utilisez jinja2 templating et
- si l'ordre des articles n'est pas important
some_stuff: &some_stuff
a:
b:
c:
combined_stuff:
<<: *some_stuff
d:
e:
f:
{{ combined_stuff | list }}