phaggi
@phaggi
лужу, паяю, ЭВМы починяю

Как модно искать частичные вхождения элементов списка в другом списке?

В исследуемом списке 'Ярославский', 'Тамбов', 'Белгород', 'тамбовский' надо выявить Тамбов и Курск) во всех видах.
Скажем, в whitelist есть слова ["амбо", "урск"]
Я сделал функцию, которая пробегает whitelist на вхождение по аргументу функции, и потом ее маплю на исследуемый список.
whitelist = ['Курск','Тамбов']
income = ['Ярославский', 'Тамбов', 'Белгород', 'тамбовский']

def test_whitelist(string: str, whitelist: list = whitelist):
    """
    :return bool: True if any element from whitelist is in string
    :param string: str 
    :param whitelist: list of 'good' words
    """
    result = False
    for good_word in whitelist:
        if good_word.lower() in string.lower():
            result = True
    return result

print(income, '\n', list(map(test_whitelist, income)))

['Ярославский', 'Тамбов', 'Белгород', 'тамбовский']
[False, True, False, True]


Вроде как работает. Но это хорошо, когда списки маленькие. А если не маленькие? Как можно находить частичные вхождения из одних больших списков в других больших списках более элегантно?

Всякие re лучше не предлагать без крайней необходимости - я в них могу, но в данном случае хотелось бы иметь просто списки, а не списки специфических паттернов.
  • Вопрос задан
  • 109 просмотров
Решения вопроса 2
@o5a
хотелось бы иметь просто списки, а не списки специфических паттернов.

Совсем не обязательно хранить как паттерны
whitelist = ['Курск','Тамбов']
income = ['Ярославский', 'Тамбов', 'Белгород', 'тамбовский']

import re

rc = re.compile(r"|".join(whitelist).lower())
income = [text for text in income if rc.search(text.lower())]
print(income)
# ['Тамбов', 'тамбовский']
Ответ написан
aRegius
@aRegius
Python Enthusiast
[any(part.lower() in word.lower() for part in words_parts) for word in words]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы