我想做字符串替换。使用gsub
或tr
我可以给出一个输入字符并将其映射到单个输出值,但我想基于多个映射创建多个输出字符串:
swap = {
'a' => ['$', '%', '^'],
'b' => ['3'],
'c' => ['4', '@'],
}
对于输入字符串'abc'
,我应该得到以下输出字符串:
'$34'
'$3@'
'%34'
'%3@'
'^34'
'^3@'
对于任意数量的输入和映射,是否有一种简单的方法可以执行此操作?实际上,它可能是大约10个输入,最多3个映射,通常只有一个。
答案 0 :(得分:6)
def gen_products(swap, str)
swap_all = Hash.new { |_,k| [k] }.merge(swap)
arr = swap_all.values_at(*str.chars)
arr.shift.product(*arr).map(&:join)
end
请参阅Hash::new(带有块),Hash#values_at和Array#product。如果h = Hash.new { |_,k| [k] }
和h
没有密钥k
,则h[k]
会返回[k]
。
swap = { 'a'=>['$', '%', '^'], 'b'=>['3'], 'c'=>['4', '@'] }
gen_products(swap, "abc")
#=> ["$34", "$3@", "%34", "%3@", "^34", "^3@"]
下面
swap_all = Hash.new { |_,k| [k] }.merge(swap)
#=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
#=> [["$", "%", "^"], ["3"], ["4", "@"]]
另一个例子:
gen_products(swap, "bca")
#=> ["34$", "34%", "34^", "3@$", "3@%", "3@^"]
还有一个:
gen_products(swap, "axbycx")
#=> ["$x3y4x", "$x3y@x", "%x3y4x", "%x3y@x", "^x3y4x", "^x3y@x"]
下面
swap_all = Hash.new { |_,k| [k] }.merge(swap)
#=> {"a"=>["$", "%", "^"], "b"=>["3"], "c"=>["4", "@"]}
vals = swap_all.values_at(*str.chars)
#=> [["$", "%", "^"], ["x"], ["3"], ["y"], ["4", "@"], ["x"]]