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 лучше не предлагать без крайней необходимости - я в них могу, но в данном случае хотелось бы иметь просто списки, а не списки специфических паттернов.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 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]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bacon
А если не маленькие?
то используют внешний софт: БД с индексами и подобное, либо смотреть библиотеки, которые построят индекс, так как со списками ничего кроме полного перебора не сделать.
Ответ написан
Ваш ответ на вопрос

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

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