【问题标题】:Is there an idiomatic way to operate on 2 arrays in Ruby?是否有一种惯用的方式来操作 Ruby 中的 2 个数组?
【发布时间】:2012-10-09 14:31:49
【问题描述】:
a = [3, 4, 7, 8, 3]
b = [5, 3, 6, 8, 3]

假设数组长度相同,有没有办法使用each 或其他惯用方式从两个数组的每个元素中获取结果?不使用计数器?

例如获取每个元素的乘积:[15, 12, 42, 64, 9]

(0..a.count - 1).each do |i|好丑……

Ruby 1.9.3

【问题讨论】:

    标签: ruby iterator ruby-1.9.3 enumerable


    【解决方案1】:

    Array.zip怎么样:

    >> a = [3,4,7,8,3]
    => [3, 4, 7, 8, 3]
    >> b = [5,3,6,8,3]
    => [5, 3, 6, 8, 3]
    >> c = []
    => []
    >> a.zip(b) do |i, j| c << i * j end
    => [[3, 5], [4, 3], [7, 6], [8, 8], [3, 3]]
    >> c
    => [15, 12, 42, 64, 9]
    

    注意:我非常不是一个 Ruby 程序员,所以对于我践踏的任何习语,我深表歉意。

    【讨论】:

    • 正要写。我就是这样做的:)
    • @Castilho:我的第一个想法是,该死的...... Ruby 必须在某个地方有一个 zip 方法。我来自 Python 大陆,所以花了几秒钟才找到它。
    • 大括号通常与单线(a.zip(b).each { |i, j| c &lt;&lt; i * j })一起使用,但这并不完全是践踏。而map 在这种特定情况下会更合适:c = a.zip(b).map { ... }
    • 您可以直接使用a.zip(b) do ... end 来避免创建中间数组,这可能对大型数组有用。
    • @matt:我想知道是否需要each。我没有意识到each 引入了另一个Array。我会改变的。
    【解决方案2】:

    出于性能原因,zip 可能更好,但transpose 保持对称,更容易理解。

    [a, b].transpose.map{|a, b| a * b}
    # => [15, 12, 42, 64, 9]
    

    ziptranspose 之间的区别在于,如果数组的长度不同,则前者默认插入nil,而后者会引发错误。根据具体情况,您可能会偏爱其中一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多