Ruby 如果没有给定值,则用nil值填充哈希

Ruby 如果没有给定值,则用nil值填充哈希,ruby,magic-square,ruby-hash,Ruby,Magic Square,Ruby Hash,我有以下阵列: positions = [[0, 1, 2], [2, 3]] values = [[15, 15, 15], [7, 7]] keys = [1, 4] 我需要创建一个散列,其键来自键,值来自值。值必须位于位置中定义的索引处。如果未定义索引,则应将nil`添加到该索引中 三个数组包含相同数量的元素;关键点有两个元素,值为2,位置为2。所以没关系 预期产出: hash = {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]} 让

我有以下阵列:

positions = [[0, 1, 2], [2, 3]] 
values = [[15, 15, 15], [7, 7]]
keys = [1, 4]
我需要创建一个散列,其键来自键,值来自值。值必须位于位置中定义的索引处。如果未定义索引,则应将nil`添加到该索引中

三个数组包含相同数量的元素;关键点有两个元素,值为2,位置为2。所以没关系

预期产出:

hash = {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}

让拉链开始吧
new_hash = {}

keys.each_with_index do |key, index|

    new_hash[key] = Array.new(positions.flatten.max + 1)
    value_array = values[index] 
    position_array = positions[index] 
    position_array.each_with_index.map { |element, i| new_hash[key][element] = value_array[i]} 
end 
new_hash

我希望这能奏效。

不是最干净的。。但有效:P

max = positions.flatten.max + 1
pv = positions.zip(values).map { |o| o.transpose.to_h }
h = {}
pv.each_with_index do |v, idx|
  h[keys[idx]] = Array.new(max).map.with_index { |_, i| v[i] }
end

# h
# {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}
或者,如果您更喜欢更压缩但可读性较差的文件

keys.zip(positions.zip(values).map { |o| o.transpose.to_h }).reduce({}) do |h, (k, v)|
  h[k] = Array.new(max).map.with_index { |_, i| v[i] }
  h
end
只是出于好奇:

nils = (0..positions.flatten.max).zip([nil]).to_h
keys.zip(positions, values).group_by(&:shift).map do |k, v|
  [k, nils.merge(v.shift.reduce(&:zip).to_h).values]
end.to_h
#⇒ {1=>[15, 15, 15, nil], 4=>[nil, nil, 7, 7]}

显示您到目前为止尝试过的内容。第一个值是否在结尾处为零,因为在所有位置中找到的最大索引是3?@这有点难以显示。我刚刚从以前的数据中提取了这三个数组键、值和位置,现在就停留在这一部分。我的尝试有点像散列[keys.zip values.values_atpositions]我知道这是胡说八道,我只是粘贴了这个想法。@adubogdan,是的,最大的索引是3。@Andrey Deineko,很难解释,但这些nil值将指示我在2d数组中的其他数组中需要数据的位置…作为公共服务,请考虑在开头加上一个句子,陈述你正在回答的问题。你使用的任何理由。next而不是“+1”?@EricDuminil,一般来说,只有当我已经在写一些公式x*y-z+1时,我才使用+1。将英语解释(即方法调用/链)与数学符号(即操作+和数字1)混合在一起有点奇怪,反之亦然。但这只是一件小事,而且是基于观点的。好吧。但这可能会导致与Enumeratornext混淆1`不那么模棱两可,IMHO.“将英语解释(即方法调用/链)与数学符号混合在一起有点奇怪”-使用positions.flatte.max.public_send:+,1:元素的数量不严格限制为4。元素的数量不严格限制为4。这在原始问题中没有提到,但现在已经修复。只需要在仓位中选择最高的指数。事实上,在其中一条评论中,作者还提到最高的指数是3@Mudasobwahighgh指数最高为3≠ 许多元素严格限制为4个。顺便说一句,使用这些硬编码的常量是一种代码味道。不过,在这个场景中有多少元素并不重要。我绝对认为,如果它被提取为一个常数,如果它是一个系统公认的约束条件,这也就不需要每次都重新计算最大值了。