我正在寻找一种在ruby 中使用索引对数组进行分区的优雅方法
例如:
["a","b",3,"c",5].partition_with_index(2)
=> [["a","b",3],["c",5]]
到目前为止,我能想到的最好的是使用下面的
["a","b",3,"c",5].partition.each_with_index{|val,index| index <= 2}
=> [["a","b",3],["c",5]]
还有其他优雅的方法可以做到这一点吗?
谢谢!
你可以做:
["a","b",3,"c",5].partition.with_index { |_, index| index <= 2 }
根据@toro2k的建议,我认为这是一个更好的解决方案,因为您将两个Enumerators
组合在一起以获得所需的输出。
如果不将代码块传递给partition
,它将返回一个Enumerator
对象。CCD_ 4具有将维持当前循环索引的CCD_ 5方法。
为什么不使用array.slice!
数组#切片!删除由索引(可以选择最大长度元素)或范围给定的元素。
> a = ['a', 'b', 'c', 5]
> b = a.slice! 0, 2 # => ['a', 'b']
> a # => ['c', 5]
在您的情况下,
> [a.slice!(0, index), a]
您可以使用Enumerable的take
和drop
方法:
a = ["a","b",3,"c",5]
[a.take(3), a.drop(3)] # => [["a", "b", 3], ["c", 5]]
我做了一份可列举的快速参考表,你可能想咨询一下这样的问题。
这是可以做到的,但不确定它是否优雅:
a = ["a","b",3,"c",5]
index = 2
[a[0..index], a[index+1..-1]]
感谢
您可以尝试以下操作:
a = ["a","b",3,"c",5]
par = a.slice_before(sum: -2) do |elem, state|
state[:sum] += 1
state[:sum] == 2
end.to_a
par
# => [["a", "b", 3], ["c", 5]]
对于您的特定情况,"pyper"gem是可用的:
require 'pyper' # gem install pyper if necessary
include Pyper
ary = ["a", "b", 3, "c", 5]
ary.τ3τ #=> ["a", "b", 3]
ary.τfτ #=> ["c", 5]
它只在小的n(被截断的元素的数量)上很容易工作,但Pyper
提供了许多其他在集合上经常遇到的任务。它的灵感来自lisp的car
和cdr
函数(请参阅匿名捐赠者的详细信息),这些字母可以组合成一个控制字符串,有点像APL。希腊语tau(τ)用于表示方法,而不是c
和r
,因此car
、cdr
变为τaτ
、τdτ
:
ary.τaτ #=> "a"
ary.τdτ #=> ["b", 3, "c", 5]
# Instead of τfτ, one can write
ary.τdddτ #=> ["c", 5]
etc.