delete = ["man", "eat"]
item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']
Мой код:
lst = []
for x in item_list:
if not any(y in x for y in delete):
lst.append([x, x])
print(lst)
Тем не менее, этот метод сделает мой вывод очень затруднительным. Например, если мое удаление содержит delete = ["man", "eat"], которое не похоже на слово "eater" в item_list, но все же программа будет принимать его, поскольку я использую, если не любой (y IN x) это "в" вернет true, потому что еда содержит внутри едока, но то, что я хотел, не содержит внутри слова, а соответствует. Я хотел бы совместить слово "пожиратель" с людоедом и человеком с человеком, а не есть для людоеда и мамы человеку.
Есть ли способ сделать полное совпадение, а не частично? Мой текущий код частично совпадает, что является неправильным, когда у меня есть много частичных слов в delete.
Затем вы можете проверить точное соответствие строк:
delete = ["man", "eat"]
item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']
lst = []
for x in item_list:
if not any(y == x for y in delete):
lst.append([x, x])
print(lst)
# [['sharper_task|$none_venue|man', 'sharper_task|$none_venue|man'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]
Примечание: or |
оператор не может быть использован внутри строки, как в 'sharper_task|eater_venue|todo'
.
Вы можете разделить строки на |
в подстроки сначала перед использованием оператора in
чтобы проверить, находятся ли элементы в delete
в одной из подстрок, далее разделенных на предыдущие подстроки с помощью _
:
lst = []
for x in item_list:
if not any(y in s.split('_') for s in x.split('|') for y in delete):
lst.append([x, x])
print(lst)
Эти результаты:
[['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]
Попробуйте ниже -
import re
del_list = ["man", "eat"]
regex = '|'.join([r'\b' + y + r'\b' for y in del_list])
item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']
lst = []
for x in item_list:
if not re.search(regex, x):
lst.append([x, x])
print(lst)
Результат этого -
[['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]
Использование одного регулярного выражения, а не списка, гарантирует, что совпадение для каждого элемента "быть удаленным" не вводит элемент item_list в выходной список, который был удален предыдущим элементом "для удаления".
Regex = '|'.join() - Здесь он создает регулярное выражение, используя raw (r '') строки с '\ b', чтобы соответствовать границам слов (обозначенным не-буквенно-цифровыми символами). Подробнее об этом читайте здесь.
Если мы используем 2 для циклов один для del_list, а другой для item_list, то результат будет выглядеть так, как показано ниже, что, по моему мнению, неверно, поскольку список "человек" все еще появляется один раз из-за "съедания", который не соответствует. Остальные элементы, которые не совпадали даже с одним из del_list, появляются дважды -
[['sharper_task|$none_venue|man', 'sharper_task|$none_venue|man'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|man_venue|king', 'sharper_task|man_venue|king'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|king_venue|world', 'sharper_task|king_venue|world'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|world_venue|dont', 'sharper_task|world_venue|dont'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|を_venue|eater', 'sharper_task|を_venue|eater'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|eater_venue|todo', 'sharper_task|eater_venue|todo'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,'], ['sharper_task|todo_venue|,', 'sharper_task|todo_venue|,']]
Предполагая, что вы хотите разделить на характер трубы,
delete = ["man", "eat"]
item_list = ['sharper_task|$none_venue|man', 'sharper_task|man_venue|king', 'sharper_task|king_venue|world', 'sharper_task|world_venue|dont', 'sharper_task|を_venue|eater', 'sharper_task|eater_venue|todo', 'sharper_task|todo_venue|,']
lst = [item
for item in item_list
if any(word in item.split('|') for word in delete)]