2013-12-21 80 views
3

設L是字符串列表。查找並在Python中查找下一個

下面是我用在列表中找到字符串texttofind代碼L.

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

你會怎麼做一個查找下一個功能?我是否需要存儲以前找到的字符串的索引?

回答

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) 
+2

可以更簡潔地寫成'matches =(line for line in L in line in line)' – Eric

+0

請注意['matches.next()'不贊成'next(matches)'](http:/ /stackoverflow.com/q/10414210/102441) – Eric

+0

@Eric,謝謝指出!我想這個函數只有在找到匹配時涉及更復雜的處理時纔有用。 – ChrisP

-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] 
+0

這不查找下一個,這個「的nextS發現」 - 它需要在未來_LINE_與比賽 – Eric

3

如果你想找到以L串具有S作爲字符串的所有索引,

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

發現在L具有作爲子s所有字符串。

[f for f in L if s in f] 
+0

尼斯,我不知道「在」字符串工作的行之後 –