Ruby数组中的奇数(或偶数)条目

Dea*_*ith 53 ruby

有没有快速的方法来获取Ruby中的数组中的所有其他条目?奇数或偶数条目值包含在奇数中.我希望能够像这样使用它:

array1 += array2.odd_values
Run Code Online (Sandbox Code Playgroud)

要么

puts array2.odd_values.join("-")
Run Code Online (Sandbox Code Playgroud)

例如

更新

这完全是我所追求的,但我确信有一个较短的版本.

array1.each_with_index do |item,index| 
  if (index %2 ==0) then 
    array2.push(item) 
  end
end
Run Code Online (Sandbox Code Playgroud)

gle*_*man 83

a = ('a'..'z').to_a

a.values_at(* a.each_index.select {|i| i.even?})
# => ["a", "c", "e", "g", "i", "k", "m", "o", "q", "s", "u", "w", "y"]

a.values_at(* a.each_index.select {|i| i.odd?})
# => ["b", "d", "f", "h", "j", "l", "n", "p", "r", "t", "v", "x", "z"]
Run Code Online (Sandbox Code Playgroud)

所以,按要求

class Array
  def odd_values
    self.values_at(* self.each_index.select {|i| i.odd?})
  end
  def even_values
    self.values_at(* self.each_index.select {|i| i.even?})
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 稍微快点:`a.values_at(*a.each_index.select(&:even?))` (9认同)

Dam*_*che 69

...

arr = ["0", "1", "2", "3"]
arr.select.each_with_index { |_, i| i.odd? }
arr.select.each_with_index { |_, i| i.even? }
Run Code Online (Sandbox Code Playgroud)

正如floum指出的那样,在Ruby 2.2中你可以简单地做到:

arr.select.with_index { |_, i| i.odd? }
Run Code Online (Sandbox Code Playgroud)

  • 实际上,在Ruby 2.2上,你可以使用`arr.select.with_index {| _,i | i.odd?}` (3认同)

小智 19

你可以使用这个:

(1..6).partition { |v| v.even? }  #=> [[2, 4, 6], [1, 3, 5]]
Run Code Online (Sandbox Code Playgroud)

来自Ruby文档:Ruby Docs Reference

  • 除了它不作用于索引,而是作用于数组元素.错误. (11认同)

Jam*_* EJ 15

left,right = a.partition.each_with_index{ |el, i| i.even? }
Run Code Online (Sandbox Code Playgroud)


Ale*_*nov 9

使用facet的一些疯狂方式:

require 'facets'
array = [1,2,3,4,5]
odd = array.to_h.keys # 1,3,5
even = array.to_h.values.compact # 2,4
Run Code Online (Sandbox Code Playgroud)


lee*_*guy 9

这可能永远不会被阅读,但......

简单干净:

array2.map{ |n| n if n % 2 == 0 }.compact # evens

array2.map{ |n| n if n % 2 == 1 }.compact # odds
Run Code Online (Sandbox Code Playgroud)

刚刚找到一种更简洁的方式(得爱Ruby):

array2.find_all{ |n| n % 2 == 0 } # evens

array2.reject  { |n| n % 2 == 0 } # odds
Run Code Online (Sandbox Code Playgroud)

  • 我认为他想要带有奇数指标的数组元素.这将返回奇数*值*的数组元素. (2认同)
  • 此外,`array.find_all(&:odd?)` 更简洁! (2认同)

Coo*_*une 5

dst = []
array.each_slice(2) { |x| dst.push(x[1]) }
Run Code Online (Sandbox Code Playgroud)

应该给你一个奇数指数的数组.

更换x[1]x[0]为偶数的条目.


Jer*_*erg 5

作为记录:

a = [1,2,3,4,5,6]
h = Hash[*a]
evens = h.keys
odds = h.values
Run Code Online (Sandbox Code Playgroud)

我使用数组的“splat”运算符来获取逗号分隔的值,并将其传递给接受参数作为交替键/值的哈希。