对于列表,方法list.index(x)
返回值为x
的第一个项目列表中的索引。但是如果我想查看列表项目,而不仅仅是整个项目,我如何为此制作最多的Pythoninc方法?
例如,使用
l = ['the cat ate the mouse',
'the tiger ate the chicken',
'the horse ate the straw']
此函数将返回1
提供的参数tiger
。
答案 0 :(得分:31)
非流畅的方法:
def index_containing_substring(the_list, substring):
for i, s in enumerate(the_list):
if substring in s:
return i
return -1
答案 1 :(得分:5)
单行:
index = [idx for idx, s in enumerate(l) if 'tiger' in s][0]
答案 2 :(得分:3)
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()
答案 3 :(得分:2)
def find(l, s):
for i in range(len(l)):
if l[i].find(s)!=-1:
return i
return None # Or -1
答案 4 :(得分:2)
这很光滑,效率很高。
>>> 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(虽然这很容易解决)。
答案 5 :(得分:1)
def first_substring(strings, substring):
return min(i for i, string in enumerate(strings) if substring in string)
注意:如果找不到匹配项,这会引发ValueError
,这在我看来更好。
答案 6 :(得分:1)
>>> 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
答案 7 :(得分:1)
imho用这一行,你会发现只有第一次出现而没有处理整个列表
index = next((i for i in enumerate(l) if "tiger" in i[1]),[-1,-1])[0]
答案 8 :(得分:0)
使用地图功能:
index = np.nonzero(map(lambda x: substring in x, strings))[0][0]