是否有一种惯用的方式来操作 Ruby 中的 2 个数组?
Posted
技术标签:
【中文标题】是否有一种惯用的方式来操作 Ruby 中的 2 个数组?【英文标题】:Is there an idiomatic way to operate on 2 arrays in Ruby? 【发布时间】: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
【问题讨论】:
【参考方案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 << 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]
zip
和transpose
之间的区别在于,如果数组的长度不同,则前者默认插入nil
,而后者会引发错误。根据具体情况,您可能会偏爱其中一个。
【讨论】:
以上是关于是否有一种惯用的方式来操作 Ruby 中的 2 个数组?的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中是不是有一种惯用的方法来编写不显眼的 JavaScript 和/或进行 AJAX 表单提交?
是否有更惯用的方法来更新 ActiveRecord 属性哈希值?
有没有一种惯用的方法来避免长的 Clojure 字符串文字?