字符串交叉产品

时间:2016-05-19 22:10:51

标签: arrays ruby string

使用:

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]

2 个答案:

答案 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_charmap或类似内容。在这种情况下(如果我们没有像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个元素。