gpt4 book ai didi

ruby - 将数组和/或标量的散列转换为标量组合数组的数组

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

我觉得这对某些人来说一定是个简单的问题,但我花了惊人的时间来寻找解决方案,却找不到我喜欢的解决方案。

我不会尝试用语言说出我需要什么,只是给出一些示例输入及其预期输出作为 Rspec 代码:

方法是:

def explode(hash)
...
end

和规范:

describe '#explode' do
it do
expect(explode({:a => 1, :b => 2})).
to eq [[:a, 1, :b, 2]]
end

it do
expect(explode({:a => 1, :b => [2,3,4]})).
to eq [
[:a, 1, :b, 2],
[:a, 1, :b, 3],
[:a, 1, :b, 4]
]
end

it do
expect(explode({:a => [1,2], :b => [3,4]})).
to eq [
[:a, 1, :b, 3],
[:a, 2, :b, 3],
[:a, 1, :b, 4],
[:a, 2, :b, 4]
]
end

it do
expect(explode({:a => 1, :b => [2,3], :c => [4,5,6]})).
to eq [
[:a, 1, :b, 2, :c, 4],
[:a, 1, :b, 3, :c, 4],
[:a, 1, :b, 2, :c, 5],
[:a, 1, :b, 3, :c, 5],
[:a, 1, :b, 2, :c, 6],
[:a, 1, :b, 3, :c, 6]
]
end
end

也欢迎使用 Ruby 以外的其他语言的解决方案。

最佳答案

Array#product似乎很适合这里。

h1 = {:a => 1, :b => 2}
h2 = {:a => 1, :b => [2,3,4]}
h3 = {:a => [1,2], :b => [3,4]}
h4 = {:a => 1, :b => [2,3], :c => [4,5,6]}

def explode hash
a, *b = hash.transform_values { |v| [*v] }.values.unshift
a.product(*b).map { |ar| hash.keys.zip(ar).flatten }.sort_by(&:last)
end

p explode h1
#[[:a, 1, :b, 2]]
p explode h2
#[[:a, 1, :b, 2],
# [:a, 1, :b, 3],
# [:a, 1, :b, 4]]

p explode h3
#[[:a, 1, :b, 3],
# [:a, 2, :b, 3],
# [:a, 1, :b, 4],
# [:a, 2, :b, 4]]

p explode h4
#[[:a, 1, :b, 2, :c, 4],
# [:a, 1, :b, 3, :c, 4],
# [:a, 1, :b, 2, :c, 5],
# [:a, 1, :b, 3, :c, 5],
# [:a, 1, :b, 2, :c, 6],
# [:a, 1, :b, 3, :c, 6]]

为了使我的方法起作用,我必须重新映射值,以便它们都是数组,这并不理想。但我仍然发布了这个答案,因为它可能会给您或其他人一个起点。

关于ruby - 将数组和/或标量的散列转换为标量组合数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482206/

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