【问题标题】:Create new arrays from nested arrays based on corresponding indexes根据相应索引从嵌套数组创建新数组
【发布时间】:2020-11-23 18:18:02
【问题描述】:

我有一个嵌套数组,我需要创建由相应索引位置的元素组成的新数组。有点难以解释,但这是我开始的内容以及我需要制作的内容:

arrays = [ 
  [["ab", "cd", "ef", "gh"], ["ik", "lm", "no", "pq"],
   ["rs", "tu", "vw", "xy"]],
  [["z1", "23", "45", "67"],["89", "AB", "CD", "EF"],["GH", "IJ", "KL", "MN"]]
]

goal = [
  [["ab", "ik", "rs"], ["cd", "lm", "tu"], ["ef", "no", "vw"], ["gh", "pq", "xy"]],
  [["z1", "89", "GH"], ["23", "AB", "IJ"], ["45", "CD", "KL"], ["67", "EF", "MN"]]
]

【问题讨论】:

  • 以后请考虑等待更长的时间再选择答案。快速选择可能会阻止其他答案,并可能导致读者不检查不正确的答案。不用着急。许多提问者至少要等几个小时,甚至更长。如果至少有一个对您有帮助,请不要忘记选择一个答案。这不是对您选择的批评。如果@Jörg 还没有这样做,我会建议使用transpose

标签: arrays ruby iteration


【解决方案1】:

你只是transposing内部数组:

arrays.map(&:transpose)
#=> [
#     [
#       ["ab", "ik", "rs"], 
#       ["cd", "lm", "tu"], 
#       ["ef", "no", "vw"], 
#       ["gh", "pq", "xy"]
#     ], 
#     [
#       ["z1", "89", "GH"], 
#       ["23", "AB", "IJ"], 
#       ["45", "CD", "KL"], 
#       ["67", "EF", "MN"]
#     ]
#   ]

【讨论】:

    【解决方案2】:
    arrays.map { |a,*b| a.zip(*b) }
      #=> [
      #     [["ab", "ik", "rs"], ["cd", "lm", "tu"], ["ef", "no", "vw"],
      #      ["gh", "pq", "xy"]],
      #     [["z1", "89", "GH"], ["23", "AB", "IJ"], ["45", "CD", "KL"],
      #      ["67", "EF", "MN"]]
      #   ] 
    

    这利用了所谓的Array decompositionarrays 有两个元素。当第一个传递给块时,块变量 ab 被赋值如下:

    a, *b = arrays[0]
      #=> [["ab", "cd", "ef", "gh"], ["ik", "lm", "no", "pq"],
      #    ["rs", "tu", "vw", "xy"]] 
    

    我们看到了

    a #=> ["ab", "cd", "ef", "gh"] 
    b #=> [["ik", "lm", "no", "pq"], ["rs", "tu", "vw", "xy"]] 
    

    Here 很好地解释了 Ruby 的 splat 运算符 (*) 的工作原理。结合使用数组分解和 splat 运算符是每个 Rubyist 都需要掌握的强大工具。

    只要可以使用Array#transpose,就可以使用Array#zip。如果数组的每个元素具有相同数量的元素,则反之亦然。由于我们正在映射,后一个要求分别适用于array[0]array[1]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2017-01-26
      • 1970-01-01
      • 2019-10-13
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多