【问题标题】:String cross product字符串叉积
【发布时间】:2016-05-19 22:10:50
【问题描述】:

使用:

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]

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    这可行:

    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"]
    

    【讨论】:

    • 有没有办法将此 &: 运算符与带参数的方法一起使用?
    • @GiorgioGambino 也许可以,你能说得更具体点吗?
    • 我已经完成了!关于这个 &: 运算符的一些阅读清除了我的想法
    【解决方案2】:

    Stefan 的回答是您应该这样做。但是,为了您的启迪,我想向您展示一种与您的解决方案相同的方法,但更“Rubyish”。

    一般来说,在 Ruby 中这是一种代码异味:

    accum = []
    
    some_enum.each do |item|
      # ...
      accum << result
    end
    

    当您看到类似这样的内容(accum 可能是字符串或整数或任何其他可以“添加”的内容)时,您可以非常确定您的 each(或 each_char 或什么有你)可以替换为mapreduce 或类似名称。在这种情况下(如果我们没有 Array#product 在 Stefan 的回答中),我们可以像这样重写您的代码:

    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。如果我们使用 map 代替,我们将得到 9 个数组,每个数组有 9 个元素。

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2022-01-18
      • 2011-08-17
      • 1970-01-01
      • 2016-05-06
      • 2019-10-18
      相关资源
      最近更新 更多