在Python中查找+查找下一个

时间:2013-12-21 17:24:15

标签: python string

设L为字符串列表。

以下是我用于在列表L中查找字符串texttofind的代码。

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

您如何进行查找下一个功能?我是否需要存储以前找到的字符串的索引?

4 个答案:

答案 0 :(得分:4)

巨大列表的一种方法是使用生成器。假设您不知道用户是否需要下一场比赛。

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

有关其他想法,请参阅How to make a repeating generator

另一次更新

我第一次写这篇文章已经好几年了。这是使用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)

答案 1 :(得分:3)

如果要查找L中具有s作为子字符串的字符串的所有索引,

[i for i in range(0, len(L)) if L[i].find(s) >= 0]

答案 2 :(得分:3)

查找L中包含子字符串s的所有字符串。

[f for f in L if s in f]

答案 3 :(得分:-1)

如果它存在,这将找到下一个。您可以将其包装在函数中,如果不包含,则返回None / Empty字符串。

L = ['Hello', 'Hola', 'Bonjour', 'Salam']

for l in L:
    if l == texttofind:
        print l
        if L.index(l) >= 0 and L.index(l) < len(L):
            print L[L.index(l)+1]