@rsytrade

Как улучшить цикл for?

Как можно вот такую конструкцию сократить или может быть улучшить?
for i in st:
    if x := re.search(fr'\b{i}\b', md):
            print(x[0])
            break

под капотом нужно обойти список st и проверить входит ли элемент из этого списка в строку md, если элемент(ы) есть, то остановить цикл на первом попавшемся и вывести принт.
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Jack444
x = lambda arr, string: next((i for i in arr if i in string), None)
print(x(st, md))
Ответ написан
Vindicar
@Vindicar
Я вижу одну проблему: i может содержать спецсимволы регулярных выражений, а ты это не учитываешь. re.escape() в помощь.
Также, если в списке st не так много строк (<100), может иметь смысл сделать одно регулярное выражение.
# если список st меняется не для каждой строки, 
# имеет смысл его подготовить один раз, заранее
parts = '|'.join(list(map(re.escape, st)))
regexp = re.compile(f'\\b(?:{parts})\\b', re.IGNORECASE)
# при обработке строки md
if match := regexp.search(md):
    print(x.group(0))
Ответ написан
Комментировать
@mayton2019
Bigdata Engineer
Обычно при улучшении (рефакторинге) ставятся две разных задачи. Первое - это улучшение читабельности кода.
И второе - это улучшение производительности (пропускной способности или времени отклика).

Это две задачи на каком-то этапе противоречат друг другу. Есть график (кривая Шипилева) который это демонстрирует.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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