Pregunta ¿Cómo combinar matrices YAML?


Me gustaría fusionar matrices en YAML, y cargarlas a través de ruby ​​-

some_stuff: &some_stuff
 - a
 - b
 - c

combined_stuff:
  <<: *some_stuff
  - d
  - e
  - f

Me gustaría tener el conjunto combinado como [a,b,c,d,e,f]

Recibo el error: no encontré la clave esperada mientras analizaba un mapeo de bloque

¿Cómo combino matrices en YAML?


32
2018-06-06 20:33


origen


Respuestas:


Contexto

Esta publicación asume el siguiente contexto:

  • Python 2.7
  • Analizador de Python YAML

Problema

lfender6445 desea combinar dos o más listas dentro de un archivo YAML, y tener esas las listas fusionadas aparecen como una lista singular cuando se analizan.

Solución

Esto se puede obtener simplemente asignando anclajes YAML a las asignaciones, donde las listas deseadas aparecen como elementos secundarios de las asignaciones. En el siguiente ejemplo tenemos tres mapeos (list_one, list_two, list_three) y tres anclajes y alias que se refieren a estas asignaciones cuando sea apropiado.

Cuando el archivo YAML se carga en el programa obtenemos la lista que queremos, pero puede requerir una pequeña modificación después de la carga (vea las trampas a continuación).

Ejemplo

Archivo original YAML

  list_one: & id001
   - un
   - b
   - c

  list_two: & id002
   - e
   - f
   - g

  list_three: & id003
   - h
   - yo
   - j

  list_combined:
      - * id001
      - * id002
      - * id003

Resultado después de YAML.safe_load

## list_combined
  [
    [
      "un",
      "segundo",
      "do"
    ],
    [
      "mi",
      "F",
      "gramo"
    ],
    [
      "h",
      "yo",
      "j"
    ]
  ]

Trampas

Conclusión

Este enfoque permite la creación de listas combinadas mediante el uso de la función de alias y ancla de YAML.

Aunque el resultado de salida es una lista anidada de listas, esto se puede transformar fácilmente utilizando flatten método.

Ver también


9
2018-06-11 02:51



Esto no va a funcionar:

  1. merge solo es compatible con las especificaciones YAML para mapeos y no para secuencias
  2. estás mezclando cosas por completo con una combinación de teclas << seguido por el separador clave / valor : y un valor que es una referencia y luego continuar con una lista en el mismo nivel de sangría

Esto no es correcto YAML:

combine_stuff:
  x: 1
  - a
  - b

Entonces, su sintaxis de ejemplo no tendría sentido como una propuesta de extensión de YAML.

Si quieres hacer algo como esto, intenta hacer el valor para combined_stuff algún tipo especial que especifique con una etiqueta YAML, para que el objeto instanciado para ese tipo sepa cómo interpretar los elementos y reemplace ese elemento con todos esos de some_stuff.


9
2018-06-06 13:55



Puede fusionar asignaciones y luego convertir sus claves en una lista, en estas condiciones:

  • si estás utilizando jinja2 y plantillas
  • si el orden del artículo no es importante
some_stuff: &some_stuff
 a:
 b:
 c:

combined_stuff:
  <<: *some_stuff
  d:
  e:
  f:

{{ combined_stuff | list }}

0
2018-01-19 13:35