Использование Python любого (), которое соответствует?

user3675572 спросил: 12 мая 2018 в 04:45 в: python

Я пишу скрипт для сортировки лог-файлов в более удобные данные, и для этого я использую функцию any (). Теперь я знаю, соответствует ли часть строки любому элементу в моем списке. Вот функция:

    def logfiles(self):    look_for = ['network', 'skip', 'remove', 'jitter', 'loss', 'diff']
    analyze = self.open_logs('logfile-1.log')
    result = []    for i in analyze:
        i = i.strip()        if any(search in i for search in look_for):
            result.append(i)    return result

Это скажет мне, если часть строки i соответствует любому из элементов в моем списке look_for. Однако есть ли способ определить, какой элемент соответствует? Я не смог найти встроенный способ для любого (), чтобы сделать это, и не думаю, что есть один, и как бы это решить? Этот фрагмент намного быстрее, чем предыдущий метод, который я использовал (простой цикл в основном), поэтому я предпочел бы продолжать использовать это.

Спасибо!

2 ответа

Есть решение
nosklo ответил: 12 мая 2018 в 04:54

Используя any, вы семантически отбрасываете возвращаемое значение. Вас не волнует, какой из них вам просто нужно, если any из них истинно.

Вместо этого я предлагаю использовать явное. Это яснее и устраняет сложность непонятного next () с обработкой исключений. Производительность одинакова:

for search in look_for:
    if search in i:
        break
else:
    print('Not found...')
user3675572 ответил: 14 мая 2018 в 07:16
Это очень помогло, спасибо! Иногда жизнь может быть настолько элегантной ...
recursive ответил: 12 мая 2018 в 04:51

Вы можете использовать next((search for search in look_for if (search in i)), None), чтобы получить первый соответствующий элемент. Он все еще замыкается, поэтому он прекратит поиск после того, как найдет совпадение. Если совпадение не найдено, возвращается второй аргумент.

YSelf ответил: 12 мая 2018 в 04:48
Но это вызывает StopIteration, если ничего не найдено.
abarnert ответил: 12 мая 2018 в 04:49
Это потребует обработки StopIteration для случая, когда ничего не найдено. (Какой может быть лучший ответ, но вы должны объяснить это здесь.)
Ignacio Vazquez-Abrams ответил: 12 мая 2018 в 04:50
Или передайте соответствующий второй аргумент next().
recursive ответил: 12 мая 2018 в 04:52
Спасибо @ IgnacioVazquez-Abrams. Я не знал об этом.
abarnert ответил: 12 мая 2018 в 05:30
@ IgnacioVazquez-Abrams Конечно, но в этом случае это не закончится чем-то более подробным, и это означает, что вам нужно выбрать значение, которое, как вы знаете, никогда не появится (или создать его с помощью _sentinel=object()).