在ruby中使用索引的分区数组



我正在寻找一种在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的takedrop方法:

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的carcdr函数(请参阅匿名捐赠者的详细信息),这些字母可以组合成一个控制字符串,有点像APL。希腊语tau(τ)用于表示方法,而不是cr,因此carcdr变为τaττdτ:

ary.τaτ #=> "a"
ary.τdτ #=> ["b", 3, "c", 5]
# Instead of τfτ, one can write
ary.τdddτ #=> ["c", 5]
etc.

最新更新