当前位置: 首页 > 知识库问答 >
问题:

如何合并YAML数组?

宣原
2023-03-14

我想在YAML中合并数组,并通过ruby加载它们-

some_stuff: &some_stuff
 - a
 - b
 - c

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

我希望组合数组为[a,b,c,d,e,F]

我收到错误:在分析块映射时找不到预期的键

我如何在YAML中合并数组?

共有2个答案

汲睿
2023-03-14
  • 注意:对此问题的另一个答案进行了大量编辑,更新了替代方法。
    • 更新后的答案提到了此答案中解决办法的替代方案。已将其添加到下面的“请参阅”部分。

    这篇文章假设了以下上下文:

    • Python 2.7
    • Python YAML解析器

    lfender6445希望在一个YAML文件中合并两个或多个列表,并在解析时将这些合并的列表显示为一个单数列表。

    这可以简单地通过将YAML锚点分配给映射来获得,其中所需的列表作为映射的子元素出现。不过,对此也有一些警告(见下文“陷阱”)。

    在下面的示例中,我们有三个映射(list_one,list_two,list_three)以及在适当的地方引用这些映射的三个锚和别名。

    当YAML文件加载到程序中时,我们得到了我们想要的列表,但加载后可能需要稍作修改(参见下面的陷阱)。

      list_one: &id001
       - a
       - b
       - c
    
      list_two: &id002
       - e
       - f
       - g
    
      list_three: &id003
       - h
       - i
       - j
    
      list_combined:
          - *id001
          - *id002
          - *id003
    
    ## list_combined
      [
        [
          "a",
          "b",
          "c"
        ],
        [
          "e",
          "f",
          "g"
        ],
        [
          "h",
          "i",
          "j"
        ]
      ]
    
    • 此方法生成列表的嵌套列表,它可能不是所需的准确输出,但可以使用flatten方法对其进行后处理
    • 通常对YAML锚和别名的警告适用于唯一性和声明顺序

    这种方法允许使用YAML的别名和锚点特性创建合并列表。

    虽然输出结果是列表的嵌套列表,但这可以使用flatten方法轻松地进行转换。

    • 请参阅替代方法
    • JavaScriptFlatten;合并/平整数组的数组
    • RubyFlatten;http://ruby-doc.org/core-2.2.2/array.html#method-i-flatten
    • PythonFlatten;https://softwareengineering.stackExchange.com/A/254676/23884

鞠侯林
2023-03-14

如果目标是运行一系列shell命令,您可能可以通过以下方式实现此目的:

# note: no dash before commands
some_stuff: &some_stuff |-
    a
    b
    c

combined_stuff:
  - *some_stuff
  - d
  - e
  - f

这相当于:

some_stuff: "a\nb\nc"

combined_stuff:
  - "a\nb\nc"
  - d
  - e
  - f

我一直在我的gitlab-ci.yml(回答@rink.attendant.6对问题的评论)中使用这个方法

我们用来支持requirements.txt从GitLab私有回购的工作示例:

.pip_git: &pip_git
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com".insteadOf "ssh://git@gitlab.com"
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts

test:
    image: python:3.7.3
    stage: test
    script:
        - *pip_git
        - pip install -q -r requirements_test.txt
        - python -m unittest discover tests

use the same `*pip_git` on e.g. build image...

其中requirements_test.txt包含例如。

-e git+ssh:/git@gitlab.com/example/example.git@v0.2.2#egg=example

 类似资料:
  • 我有以下损坏的docker compose文件 此操作失败,并显示以下错误 问题1:如何在中合并数组?我尝试使用的语法是用于合并字典的语法 问题2:如果没有办法合并数组,有没有变通方法? 用例:我有多个服务,其中一些映射一些卷,另一些映射其他卷,另一些映射所有卷。我不想重复我自己。 谢谢你!

  • 问题内容: 对于我正在编写的某些代码,我需要从1到20跳过6进行迭代。 有没有办法更有效地做到这一点? 问题答案: 在python 2中,您没有合并“范围函数”;这些只是列表。您的示例效果很好。但是range总是在内存中创建一个完整列表,因此,如果仅在for循环中需要,一种更好的方法是使用生成器表达式和xrange: 在生成器表达式中,if部分可以包含要跳过数字的复杂逻辑。 组合可迭代对象的另一种

  • 问题内容: 您好,我想基于数组中的唯一项合并数组。 我拥有的对象 在这个totalCells数组中,我有几个这样的对象 现在,我想制作一个数组,在该数组中我可以基于lineNumber进行数组组合。 就像我有一个具有lineNumber属性和cellWidth集合的对象。我可以这样做吗? 我可以遍历每一行并检查行号是否相同,然后按该单元格宽度。有什么办法我可以算吗? 我正在尝试获得这样的输出。 问

  • 问题内容: 如何在PHP中合并n个数组 我的意思是我怎么可以这样做的工作: OR 里面有多个数组的数组在哪里,像这样: 我的结果是: 我需要的是 问题答案: array_merge可以接受可变数量的参数,因此,使用一些call_user_func_array技巧,您可以将数组传递给它: 基本上可以像输入以下内容一样运行: 更新: 现在有了5.6,我们有了运算符来将数组解压缩为参数,因此您可以: 并

  • 问题是== 将nums1和nums2合并到一个按非递减顺序排序的数组中。 最终排序的数组不应由函数返回,而应存储在数组 nums1 中。为了适应这种情况,nums1 的长度为 m n,其中前 m 个元素表示应合并的元素,最后 n 个元素设置为 0 并应忽略。nums2 的长度为 n。 我的代码中有什么错误??? 您的意见 我的产出 预期产出

  • 问题内容: 我有两个字节数组,我想知道如何将一个添加到另一个或组合它们以形成一个新的字节数组。 问题答案: 您只是想将两个数组连接起来? 或者您可以使用: 或者您可以使用a 来完成工作: 或者,您可以简单地利用添加多个数组的优势。