Ruby on rails Ruby/Rails如何拆分数组指定步骤

Ruby on rails Ruby/Rails如何拆分数组指定步骤,ruby-on-rails,ruby,Ruby On Rails,Ruby,假设我有一个数组arr=[1,2,3,4,5,6,7,8,9,10] 如何拆分此数组以获得包含步骤指定元素的组 例如: input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ... output = [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]] 有什么内置的功能或优雅的方式来实现吗?使用 请尝试以下操作: input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] n = 3 x = input.each_slice(

假设我有一个数组arr=[1,2,3,4,5,6,7,8,9,10]

如何拆分此数组以获得包含步骤指定元素的组

例如:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
...
output = [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
有什么内置的功能或优雅的方式来实现吗?

使用

请尝试以下操作:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3
x = input.each_slice(n).to_a # => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
output = x[0].zip(*x[1..-1]).map(&:compact) # => [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
很遗憾,您不能在此处使用:

更新:备选方案

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = 3
output = (1..n).map { [] }
input.each_with_index do |x, i| output[i % n] << x end
output # => [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]

我会这样做如下:

n = 3
input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = input.each_slice(n).to_a
output = (0...n).map { |i| a.map{|e| e[i]}.compact }
# => [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
从@falsetru链接中获取方法表示:

def divide(input, n)
  a = input.each_slice(n).to_a
  (0...n).map { |i| a.map{|e| e[i]}.compact }
end

p divide([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 3)
p divide([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 3)
p divide([1, 2, 3], 3)
# >> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]
# >> [[1, 4, 7, 10, 13, 16], [2, 5, 8, 11, 14], [3, 6, 9, 12, 15]]
# >> [[1], [2], [3]]

如果这些值是连续的(如示例所示),则可以将group_by与step一起用作模数:

> (1..10).group_by {|v| v % 3 }.values
=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]] 
如果它们不是连续的,那么您仍然可以在一行中完成,尽管它有点不那么优雅:

> (1..10).each_with_index.group_by {|v| v[1] % 3 }.map {|k,v| v.map &:first }
=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]] 

OP到底在找什么我没有得到..@ArupRakshit,OP想要这样的东西xs=[1,2,3,4,5,6,7,8,9,10];[xs[i::3]用于Ruby的Python代码。@ArupRakshit[xs[0],xs[3],xs[6],…],[xs[1],xs[4],xs[7],…],[xs[2],xs[5],xs[8],…]@ArupRakshit,可能我误解了。OP接受了答案,然后又不接受;嗯,我看到了。OP发布了一篇非常混乱的帖子:Try with input=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]。a、 如果定义了大小-1,则应将其替换为3或n。现在,请尝试输入=[1,2,3];顺便说一句,为什么不按照我的建议更换呢?@falsetru我不明白你的意思。。你能代表我编辑吗?这是巧合。a、 大小-1==3。这个版本只适用于你说得对的情况。这是一个错误。你为什么把3。。请仅了解您的想法,根据OP的示例,3是所需的步骤。Huum意味着Rangestep也可以通过这种方式为Array实现。。对吧?我不太明白这个问题。数组和枚举都没有实现步骤。我知道OP没有给出预期输出的原因。。意思是问题不清楚。但您的代码以非常好的方式生成了输出,所以我正在考虑将来在哪里可以想到您的想法
> (1..10).each_with_index.group_by {|v| v[1] % 3 }.map {|k,v| v.map &:first }
=> [[1, 4, 7, 10], [2, 5, 8], [3, 6, 9]]