list1 = ['Google', 'Stanford University', 'Karlsruhe Institute of Technology (KIT) / University of Karlsruhe (TH)', 'AU-KBC Research Centre']
exclusion_list = ['university','institute','school','University','Institute','School']
output=['Google','AU-KBC Research Centre']
На выходе должны быть только те элементы, которые не содержат слов (элементов) из exclusion_list
Я искал все SO. Но ни один из них не дает ответа конкретно на эту проблему. Я пробовал использовать filter()
, а также глупую функцию. Но я ищу решение без грубой силы. Кроме того, мне любопытно дополнительное решение, которое использует регулярное выражение для решения проблемы.
Я ищу оптимальный способ удалить любой университет, школу или институт из list1
EDIT: I want to preserve the order of the list as well. I apologize for not making this point clear.
Для эффективного решения вы можете использовать sets
здесь. Определите exclusion_list
как set
и используйте понимание списка, чтобы проверить принадлежность каждого слова в list1
:
list1 = ['Google', 'Stanford University',
'Karlsruhe Institute of Technology (KIT) / University of Karlsruhe (TH)',
'AU-KBC Research Centre']
# define a set from the exclusion_list
exclusion_list = set(['university','institute','school','University','Institute','School'])
[i for i in list1 if not set(i.split()).intersection(exclusion_list)]
# ['Google', 'AU-KBC Research Centre']
Мы можем сделать что-то вроде следующего:
out = []
excl = set(exclusion_list)
for item in list1:
for word in item.split():
if word in excl:
break
else:
out.append(item)
import pandas as pd
k = pd.Series(['Google', 'Stanford University', 'Karlsruhe Institute of Technology (KIT) / University of Karlsruhe (TH)', 'AU-KBC Research Centre'])
k[~k.str.contains('|'.join(exclusion_list))].tolist()
Один лайнер:
[s for s in list1 if not any(e in s.lower() for e in exclusion_list)]
Аналогично возможно с фильтром, как вы упомянули:
list(filter(lambda s: not any(e in s.lower() for e in exclusion_list), list1))
Попробуй это.
list1 = ['Google', 'Stanford University', 'Karlsruhe Institute of Technology (KIT) / University of Karlsruhe (TH)', 'AU-KBC Research Centre']
exclusion_list = ['university','institute','school','University','Institute','School']
exclusion_list = [i.lower() for i in exclusion_list]
for i in list1:
if not any(map(lambda x:x in i.lower(), exclusion_list)):
print(i)
Этот ответ более читабелен и сохраняет порядок! Спасибо!
Попробуй это:
[name for name in list1 if not any(x.lower() in name.lower() for x in set(exclusion_list)) ]
Если вы добавите
i.lower().split()
в условие, вам потребуются только слова нижнего регистра в списке исключений.