gpt4 book ai didi

ruby - 将一个数组翻译成一些数组

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

我想将一个 Ruby 数组(可能包含一些子数组)扩展为另一个数组数组,就像在这些示例中一样:

示例 1:[:foo, :bar]

[
[:foo, :bar]
]

示例 2:[:foo, :bar, [:ki, :ku]]

[
[:foo, :bar, :ki],
[:foo, :bar, :ku]
]

示例 3:[:foo, :bar, :baz, [:a, :i, :u, :e, :o], :qux]

[
[:foo, :bar, :baz, :a, :qux],
[:foo, :bar, :baz, :i, :qux],
[:foo, :bar, :baz, :u, :qux],
[:foo, :bar, :baz, :e, :qux],
[:foo, :bar, :baz, :o, :qux]
]

示例 4:[:foo, :bar, :baz, [:a, :i, :u, :e, :o], [1, 2], :qux]

[
[:foo, :bar, :baz, :a, 1, :qux],
[:foo, :bar, :baz, :i, 1, :qux],
[:foo, :bar, :baz, :u, 1, :qux],
[:foo, :bar, :baz, :e, 1, :qux],
[:foo, :bar, :baz, :o, 1, :qux],
[:foo, :bar, :baz, :a, 2, :qux],
[:foo, :bar, :baz, :i, 2, :qux],
[:foo, :bar, :baz, :u, 2, :qux],
[:foo, :bar, :baz, :e, 2, :qux],
[:foo, :bar, :baz, :o, 2, :qux]
]

示例 5:[:foo, [[], :c], :bar]

[
[:foo, [], :bar],
[:foo, :c, :bar]
]

示例 6:[:foo, [[:a, :b], :c], :bar]

[
[:foo, [:a, :b], :bar],
[:foo, :c, :bar]
]

注意:只有子数组应该展开。这就是示例 5 和 6 中未扩展子子数组的原因。

非常感谢任何建议或代码。

最佳答案

我使用了product的思路来实现这个功能:

def trans(a)
b = a.map{|e| [e].flatten(1)}
b.first.product(*b.slice(1..-1))
end

例如,这段代码:

puts trans([:foo, :bar]).inspect
puts trans([:foo, :bar, :baz, [:a, :i, :u, :e, :o], [1, 2], :qux]).inspect
puts trans([:foo, [[], :c], :bar]).inspect
puts trans([:foo, [[:a, :b], :c], :bar]).inspect

给出这个:

[[:foo, :bar]]
[[:foo, :bar, :baz, :a, 1, :qux],
[:foo, :bar, :baz, :a, 2, :qux],
[:foo, :bar, :baz, :i, 1, :qux],
[:foo, :bar, :baz, :i, 2, :qux],
[:foo, :bar, :baz, :u, 1, :qux],
[:foo, :bar, :baz, :u, 2, :qux],
[:foo, :bar, :baz, :e, 1, :qux],
[:foo, :bar, :baz, :e, 2, :qux],
[:foo, :bar, :baz, :o, 1, :qux],
[:foo, :bar, :baz, :o, 2, :qux]]
[[:foo, [], :bar],
[:foo, :c, :bar]]
[[:foo, [:a, :b], :bar],
[:foo, :c, :bar]]

编辑:上面代码的解释。

一般的想法是我们想要数组中所有元素的乘积。如果您查看 Array#product 的文档,您会发现它按照您的意愿运行——我们只需要适本地调用它即可。

首先,product 对数组进行操作,因此我们必须确保原始数组中的所有项目本身都是数组。这是函数第一行的任务:

b = a.map{|e| [e].flatten(1)}

我们正在使用 map 转换数组中的所有元素。转换生成一个包含元素 e 的数组,然后展平这个新数组。原始元素要么是一个数组,要么不是;如果它不是一个数组,[e].flatten(1) 将不执行任何操作并返回 [e];如果它是一个数组,[e] 将评估为 [[x]],然后将其展平为 [x]1 告诉 flatten 只深入一层。

然后我们所要做的就是在第一个元素上调用 product 并将修改后的数组的其余元素作为参数传递:

b.first.product(*b.slice(1..-1))

这里,b.slice(1..-1) 表示:从 b 中取出元素,从第 2 个开始一直到最后一个。最后,星号表示我们不想将数组作为参数传递,而是传递数组的元素。

关于ruby - 将一个数组翻译成一些数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9655847/

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