#python #python-3.x #search #set
#python #python-3.x #Поиск #set
Вопрос:
Я пытаюсь выполнить поиск по большому списку, и, насколько я понимаю, очень быстро использовать набор, а не обычный список. Моя задача — использовать оператор if в сочетании с регулярным выражением, чтобы найти строку в списке.
Я попробовал следующее:
import re
search = re.compile('[edits')
if search in set(list):
print('found')
Я создал список, в котором в качестве элемента указан «[редактировать интерфейсы]», но, похоже, он его не находит.
Комментарии:
1. «Я пытаюсь выполнить поиск по большому списку, и из того, что я понял, очень быстро использовать набор, а не обычный список». Это для тестирования членства на основе хэша. Если вам все равно придется перебирать все подряд, это не сэкономит вам времени.
Ответ №1:
Я думаю, это может быть то, что вы ищете
search = re.compile('[edits')
l1 = ["that", '[edit interfaces]', "that"]
for v in set(l1):
if re.search(search, v):
print('found ' v)
Вы должны проверить элементы набора, чтобы увидеть, соответствуют ли они регулярному выражению. Вы можете просто сделать это с помощью простой проверки внутри цикла for .
Комментарии:
1. На самом деле это не ускоряет процесс. Я имею в виду, потенциально, если было много дубликатов.
Ответ №2:
Я думаю, может быть, вы можете не изменять список на набор и вместо этого использовать встроенную функцию фильтра python.
import re
search = re.compile('[edits')
l1 = ["that", '[edit interfaces]', "that"]
res = filter(lambda x : re.search(search, x), l1)
print(list(res))
Этот метод позволяет избежать перебора списка и использует встроенные в python функции, которые работают быстро.
Комментарии:
1. Это то решение, которое вы искали?
2. Большое вам спасибо. Да, Филип. Я так думаю.. Оба ваших решения хороши. Мне просто интересно, какой из них самый быстрый… Из того, что вы говорите, похоже, что использование filter быстрее…
3. Почему элементы в списке исчезают после выполнения первого поиска?
4. >>> res = filter(лямбда x : re.search(поиск, x), l1) >>> len(список (res)) 1 >>> len(список (res)) 0
5. Это потому, что filter возвращает итератор. Когда вы вызываете list(результат), он в основном проходит через весь итератор (результатом является итератор). Итак, когда вы вызываете его во второй раз. Результатом является просто пустой итератор. Я надеюсь, что это разъяснение поможет.