使用:
digits = '123456789'
cols = 'ABCDEFGHI'
我想要输出:
["1A", "1B", "1C", "1D", "1E", "1F", "1G", "1H", "1I", "2A", "2B",
"2C", "2D", "2E", "2F", "2G", "2H", "2I", "3A", "3B", "3C", "3D",
"3E", "3F", "3G", "3H", "3I", "4A", "4B", "4C", "4D", "4E", "4F",
"4G", "4H", "4I", "5A", "5B", "5C", "5D", "5E", "5F", "5G", "5H",
"5I", "6A", "6B", "6C", "6D", "6E", "6F", "6G", "6H", "6I", "7A",
"7B", "7C", "7D", "7E", "7F", "7G", "7H", "7I", "8A", "8B", "8C",
"8D", "8E", "8F", "8G", "8H", "8I", "9A", "9B", "9C", "9D", "9E",
"9F", "9G", "9H", "9I"]
我的代码是:
def cross_prod(str_1 , str_2)
res = []
str_1.each_char do |a|
str_2.each_char do |b|
res << (a + b)
end
end
return res
end
cross_prod(digits, cols)
有没有更好的方法来实现此方法?在Python中,它涉及一行代码[a+b for a in A for b in B]
。
答案 0 :(得分:7)
这样可行:
digits.chars.product(cols.chars).map(&:join)
#=> ["1A", "1B", "1C", "1D", "1E", "1F", "1G", "1H", "1I",
# "2A", "2B", "2C", "2D", "2E", "2F", "2G", "2H", "2I",
# "3A", "3B", "3C", "3D", "3E", "3F", "3G", "3H", "3I",
# "4A", "4B", "4C", "4D", "4E", "4F", "4G", "4H", "4I",
# "5A", "5B", "5C", "5D", "5E", "5F", "5G", "5H", "5I",
# "6A", "6B", "6C", "6D", "6E", "6F", "6G", "6H", "6I",
# "7A", "7B", "7C", "7D", "7E", "7F", "7G", "7H", "7I",
# "8A", "8B", "8C", "8D", "8E", "8F", "8G", "8H", "8I",
# "9A", "9B", "9C", "9D", "9E", "9F", "9G", "9H", "9I"]
答案 1 :(得分:3)
Stefan的回答是你应该做的方式。但是,仅仅为了您的启发,我想向您展示一种与您的解决方案相同的方式,但更像是“Rubyish”。
一般来说,在Ruby中,这是一种代码味道:
accum = []
some_enum.each do |item|
# ...
accum << result
end
当您看到类似这样的内容时(accum
可能是字符串或整数或其他任何可以“添加到”的内容),您可以非常肯定您的each
(或{{ 1}}或whathaveyou)可以替换为each_char
,map
或类似内容。在这种情况下(如果我们没有像Stefan的回答中那样reduce
)我们可以像这样重写你的代码:
Array#product
这里我们在外部循环中使用def cross_prod(str_1 , str_2)
str_1.each_char.flat_map do |a|
str_2.each_char.map {|b| a + b }
end
end
。如果我们使用了flat_map
,我们就会得到9个阵列,每个阵列都有9个元素。