Скажем, у меня есть массив предложений:
sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong"]
И у меня есть черный список имен:
blacklist = ["Jack", "Kat"]
Теперь мне нужно отфильтровать sentences
в массив, который удаляет все предложения, содержащие имена из черного списка, поэтому:
["Tom is a good person"]
Как бы я сделал это в Ruby?
Благодарность!
3 ответа
sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong",
"Kathy knows her stuff"]
blacklist = ["Jack", "Kat"]
r = /\b#{Regexp.union(blacklist)}\b/
#=> /\b(?-mix:Jack|Kat)\b/
sentences.reject { |s| s.match?(r) }
#=> ["Tom is a good person", "Kathy knows her stuff"]
Разрывы слов (\b
) необходимы в регулярном выражении, чтобы "Kat"
не совпадал с первыми тремя буквами "Kathy"
. Можно вместо этого написать:
r = /\b#{blacklist.join('|')}\b/
#=> /\bJack|Kat\b/
Вам просто нужно отклонить записи
sentences.reject!{|sentence| sentence.match(blacklist.join('|'))}
Вы получите необходимый результат -
["Tom is a good person"]
Документы для отклонения! - https://ruby-doc.org /core-2.2.0/Array.html#method-i-reject-21
reject!
обновит тот же массив, если вы этого не хотите, вы можете использовать reject
и сохранить в новом массиве.
Вернитесь к =~
:)
sentences.reject!{|sentence| !((Regexp.new(blacklist.join('|')) =~ sentence).nil?) }
Отклоните предложение, если `= ~ 'найдет совпадение (Используемый код -! Nil?)
Это собирается сделать по существу то же самое. Хотя рубин говорит, матч быстрее
sentences = ["Tom is a good person", "Jack spent some time", "Kat did something wrong"]
blacklist = ["Jack", "Kat"]
Программа
p sentences.filter{|string|!(blacklist.map{|x|string.match?(x)}.any?)}
Если вы используете
Результатp sentences.select{|string|!(blacklist.map{|x|string.include?(x)}.any?)}
["Tom is a good person"]
Похожие вопросы
Новые вопросы
arrays
Массив - это упорядоченная линейная структура данных, состоящая из набора элементов (значений, переменных или ссылок), каждый из которых идентифицируется одним или несколькими индексами. Когда вы спрашиваете о конкретных вариантах массивов, используйте вместо них следующие связанные теги: [vector], [arraylist], [matrix]. При использовании этого тега в вопросе, относящемся к языку программирования, пометьте вопрос используемым языком программирования.