設L是字符串列表。查找並在Python中查找下一個
下面是我用在列表中找到字符串texttofind
代碼L.
texttofind = 'Bonjour'
for s in L:
if texttofind in s:
print 'Found!'
print s
break
你會怎麼做一個查找下一個功能?我是否需要存儲以前找到的字符串的索引?
設L是字符串列表。查找並在Python中查找下一個
下面是我用在列表中找到字符串texttofind
代碼L.
texttofind = 'Bonjour'
for s in L:
if texttofind in s:
print 'Found!'
print s
break
你會怎麼做一個查找下一個功能?我是否需要存儲以前找到的字符串的索引?
巨大列表的一種方法是使用生成器。假設你不知道用戶是否需要下一場比賽。
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)
如果存在,將會找到下一個。你可以將它封裝在函數中,如果沒有則返回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]
這不查找下一個,這個「的nextS發現」 - 它需要在未來_LINE_與比賽 – Eric
如果你想找到以L串具有S作爲字符串的所有索引,
[i for i in range(0, len(L)) if L[i].find(s) >= 0]
發現在L
具有作爲子s
所有字符串。
[f for f in L if s in f]
尼斯,我不知道「在」字符串工作的行之後 –
可以更簡潔地寫成'matches =(line for line in L in line in line)' – Eric
請注意['matches.next()'不贊成'next(matches)'](http:/ /stackoverflow.com/q/10414210/102441) – Eric
@Eric,謝謝指出!我想這個函數只有在找到匹配時涉及更復雜的處理時纔有用。 – ChrisP