#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 впоследствии.