gpt4 book ai didi

ruby - 如何实例化具有任意深度的多级散列

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:11 25 4
gpt4 key购买 nike

我想根据数据库查询的结果创建一个散列,这样它的键是除最后一个列之外的列值,而值是最后一个列值(或默认值)。例如,如果我有行:

1 2 3 1
1 2 4 9
1 3 2 nil

和默认值 111,我应该得到:

{
1 =>
{
2 => { 3 => 1, 4 => 9},
3 => { 2 => 111}
}
}

我想让该方法足够通用以处理任意数量的列,因此签名可以是:

to_lookup(rows, default_value, value_column, *columns)

我该怎么做?

更新:忘记了输出中的逗号。

最佳答案

[编辑:阅读@cthulhu 的回答后,我想我可能误解了这个问题。我假设要对连续的行进行分组,而不是对所有行进行分组。我会留下我对前一个解释的回答。]

我相信这就是您要找的:

def hashify(arr)
return arr.first.first if arr.first.size == 1
arr.slice_when { |f,s| f.first != s.first }.
each_with_object({}) do |a,h|
key, *rest = a.transpose
h[key.first] = hashify(rest.transpose)
end
end

hashify [[1, 2, 3, 1], [1, 2, 4, 9], [1, 3, 2, nil]]
#=> {1=>{2=>{3=>1, 4=>9}, 3=>{2=>nil}}}

hashify [[1, 2, 3, 1], [1, 2, 4, 9], [2, 3, 2, nil]]
#=> {1=>{2=>{3=>1, 4=>9}}, 2=>{3=>{2=>nil}}}

nil 替换为默认值可以在构建哈希之前或之后完成。

Enumerable#slice_when是在 v2.2 中赋予我们的。对于早期版本,您可以替换:

arr.slice_when { |f,s| f.first != s.first }

arr.chunk { |row| row.first }.map(&:last)

关于ruby - 如何实例化具有任意深度的多级散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com