Как получить второй элемент массива в массиве ruby

#ruby

#ruby

Вопрос:

У меня есть набор следующим образом:

 verb_tag_set = Set.new ["VB", "VBD", "VBG", "VBN", "VBP", "VBZ", "MD"]
  

Мой массив tagged_text содержит следующее:

 tagged_text = [["VB", "go"], ["VBG", "going"]]
  

Я пытаюсь получить все элементы второй строки каждого массива, выбирая те массивы, которые содержат элемент, соответствующий одному из элементов в наборе verb_tag_set.

     verb_tagged_array = tagged_text.select{|el| el[1] if verb_tag_set.include?(el[0])}
    verb_tagged_array.map{|row| row[1]}
  

Хотя это работает, я должен быть в состоянии получить массив в одной строке.

Есть идеи о том, как усовершенствовать этот код?

Новичок в ruby, поэтому любая помощь приветствуется.

Комментарии:

1. Ваш вопрос немного сбивает с толку. Во-первых, в Ruby нет понятия о массивах, имеющих «строки». Кроме того, где у вас есть verb_tag_set.include?(el[1]) , вы не имеете в виду verb_tag_set.include?(el[0]) , и в следующей строке это должно быть row[1] ? Было бы полезно, если бы вы показали желаемый результат (массив).

2. Прошу прощения. Я внес изменения. На самом деле я написал свой массив tagged_text в неправильном порядке. Спасибо, что указали на это.

Ответ №1:

Похоже, вы хотите следующее.

 require 'set'

verb_tag_set = Set.new ["VB", "VBD", "VBG", "VBN", "VBP", "VBZ", "MD"]    
tagged_text = [["VB", "go"], ["VBG", "going"]]

tagged_text.select { |a,b| verb_tag_set.include?(a) }.map(amp;:last)
  #=> ["go", "going"] 
  

Комментарии:

1. Мне часто становится жаль отсутствия map_reduce функции «из коробки» в ruby.

2. Я выбрал этот ответ, поскольку мне было легче понять на моем уровне. Оба отлично работают.

Ответ №2:

 require 'set'

verb_tag_set = Set.new ["VB", "VBD", "VBG", "VBN", "VBP", "VBZ", "MD"]    
tagged_text = [["VB", "go"], ["VBG", "going"]]

verb_tag_set.map(amp;tagged_text.to_h.method(:[])).compact
#⇒ [ "go", "going" ]
  

Здесь мы используем tagged_text как функцию сопоставления для набора, избавляясь от nil s впоследствии.