![](/img/trans.png)
[英]Find all instances of a sub-string in a list of strings and return the index of the string where the sub-string is found
[英]Get first list index containing sub-string?
对于列表,方法list.index(x)
返回值为x
的第一项在列表中的索引。 但是如果我想查看列表项的内部,而不仅仅是查看整个项目,我该如何为此制作最 Pythoninc 方法?
例如,与
l = ['the cat ate the mouse',
'the tiger ate the chicken',
'the horse ate the straw']
这个 function 将返回1
并提供参数tiger
。
一个非光滑的方法:
def index_containing_substring(the_list, substring):
for i, s in enumerate(the_list):
if substring in s:
return i
return -1
单线:
index = [idx for idx, s in enumerate(l) if 'tiger' in s][0]
abyx 解决方案的变化(优化为找到匹配时停止)
def first_substring(strings, substring):
return next(i for i, string in enumerate(strings) if substring in string)
如果你是 2.6 之前的你需要把next()
放在最后
def first_substring(strings, substring):
return (i for i, string in enumerate(strings) if substring in string).next()
这是非常巧妙且相当有效的。
>>> def find(lst, predicate):
... return (i for i, j in enumerate(lst) if predicate(j)).next()
...
>>> l = ['the cat ate the mouse','the tiger ate the chicken','the horse ate the straw']
>>> find(l, lambda x: 'tiger' in x)
1
唯一的问题是,如果未找到该项目,它将引发 StopIteration(尽管这很容易补救)。
def find(l, s):
for i in range(len(l)):
if l[i].find(s)!=-1:
return i
return None # Or -1
def first_substring(strings, substring):
return min(i for i, string in enumerate(strings) if substring in string)
注意:如果找不到匹配项,这将引发ValueError
,这在我看来更好。
恕我直言,使用这一行,您将只找到第一次出现,而无需处理整个列表
index = next((i for i in enumerate(l) if "tiger" in i[1]),[-1,-1])[0]
>>> li = ['my','array','with','words']
>>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word == 'my' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
0
>>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word == 'words' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
3
使用地图功能:
index = np.nonzero(map(lambda x: substring in x, strings))[0][0]
@kennytm 提供了一个很好的答案,对我有帮助; 从他们的构建一个允许正则表达式的 function,我写道:
def substringindex(inputlist, inputsubstring):
s = [x for x in inputlist if re.search(inputsubstring, x)]
if s != []:
return (inputlist.index(s[0]), s[0])
return -1
这个 function 和他们的完全一样,但支持正则表达式。
如果找不到项目,我只想获取文本而不引发异常
search = 'a'
next((s for s in ["aa",'c'] if search in s), None)
search = 'b'
next((el for el in ["aa",'c'] if search in el), None)
这是我希望在本地实现的事情之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.