Ответ 1
strings = ("string1", "string2", "string3")
for line in file:
if any(s in line for s in strings):
print "yay!"
Возможный дубликат:
Проверьте, существует ли несколько строк в другой строке
Я пытаюсь выяснить, есть ли хороший и чистый способ протестировать 3 разных строки.
В основном я выполняю цикл через файл с использованием цикла for
; то я должен проверить, содержит ли он одну из трех строк, которые я установил в списке.
До сих пор я обнаружил, что проверка состояния нескольких if, но это не очень элегантно и эффективно:
for line in file
if "string1" in line or "string2" in line or "string3" in line:
print "found the string"
Я думал, как создать список, содержащий string1
, string2
и string3
, и проверить, содержится ли какое-либо из них в строке, но, похоже, я не могу просто сравнить список без явным образом прохожу через список, и в этом случае я в основном в тех же условиях, что и в выражении multiple if, которое я написал выше.
Есть ли какой-либо умный способ проверить несколько строк без написания длинных операторов if или loop через элементы списка?
strings = ("string1", "string2", "string3")
for line in file:
if any(s in line for s in strings):
print "yay!"
Это все еще проходит через декартово произведение двух списков, но это делает одну строку:
>>> lines1 = ['soup', 'butter', 'venison']
>>> lines2 = ['prune', 'rye', 'turkey']
>>> search_strings = ['a', 'b', 'c']
>>> any(s in l for l in lines1 for s in search_strings)
True
>>> any(s in l for l in lines2 for s in search_strings)
False
Это также имеет то преимущество, что any
короткое замыкание, и поэтому цикл останавливается, как только будет найдено совпадение. Кроме того, это только находит первое вхождение строки из search_strings
в linesX
. Если вы хотите найти несколько вхождений, вы можете сделать что-то вроде этого:
>>> lines3 = ['corn', 'butter', 'apples']
>>> [(s, l) for l in lines3 for s in search_strings if s in l]
[('c', 'corn'), ('b', 'butter'), ('a', 'apples')]
Если вам кажется, что кодирование происходит чем-то более сложным, кажется, алгоритм Aho-Corasick может проверить наличие нескольких подстрок в заданной входной строке. (Спасибо Niklas B. за указание на это.) Я все еще думаю, что это приведет к квадратичной производительности для вашего случая использования, так как вам все равно придется называть его несколько раз для поиска нескольких строк. Тем не менее, он будет бить выше (кубический, в среднем) алгоритм.
Один подход заключается в объединении строк поиска в шаблон регулярного выражения, как в этом ответе.