Find + Find next in Python
Question: Let L be a list of strings.

Here is the code I use for finding a string `texttofind` in the list L.

    
    
    texttofind = 'Bonjour'
    for s in L:
        if texttofind in s:
            print 'Found!'
            print s
            break
    

How would you do a **Find next** feature ? Do I need to store the index of the
previously found string?


Answer: One approach for huge lists would be to use a generator. Suppose you do not
know whether the user will need the next match.

    
    
    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
    

The other answers suggesting list comprehensions are great for short lists
when you want all results immediately. The nice thing about this approach is
that if you never need the third result no time is wasted finding it. Again,
it would really only matter for big lists.

**Update:** If you want the cycle to restart at the first match, you could do
something like this...

    
    
    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
    

See [How to make a repeating
generator](http://stackoverflow.com/questions/1376438/how-to-make-a-repeating-
generator-in-python) for other ideas.

**Another Update**

It's been years since I first wrote this. Here's a better approach using
[`itertools.cycle`](https://docs.python.org/3.5/library/itertools.html#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)
    

