Одним из подходов для огромных списков было бы использование генератора. Предположим, вы не знаете, понадобится ли пользователю следующее совпадение.
def string_in_list(s, entities):
"""Return elements of entities that contain given string."""
for e in entities:
if s in e:
yield e
huge_list = ['you', 'say', 'hello', 'I', 'say', 'goodbye'] # ...
matches = string_in_list('y', huge_list) # look for strings with letter 'y'
next(matches) # first match
next(matches) # second match
Другие ответы, предлагающие понимание списков, отлично подходят для коротких списков, когда вам нужны все результаты немедленно. Преимущество этого подхода заключается в том, что если вам никогда не понадобится третий результат, вы не тратите время на его поиск. Опять же, это будет иметь значение только для больших списков.
Обновление: если вы хотите, чтобы цикл перезапускался при первом совпадении, вы можете сделать что-то вроде этого...
def string_in_list(s, entities):
idx = 0
while idx < len(entities):
if s in entities[idx]:
yield entities[idx]
idx += 1
if idx >= len(entities):
# restart from the beginning
idx = 0
huge_list = ['you', 'say', 'hello']
m = string_in_list('y', huge_list)
next(m) # you
next(m) # say
next(m) # you, again
Другие идеи см. в разделе Как создать повторяющийся генератор.
Еще одно обновление
Прошли годы с тех пор, как я впервые написал это. Вот лучший подход с использованием itertools.cycle
:
from itertools import cycle # will repeat after end
# look for s in items of huge_list
matches = cycle(i for i in huge_list if s in i)
next(matches)
person
ChrisP
schedule
21.12.2013