Ответ 1
Непрозрачный метод:
def index_containing_substring(the_list, substring):
for i, s in enumerate(the_list):
if substring in s:
return i
return -1
Для списков метод list.index(x)
возвращает индекс в списке первого элемента, значение которого x
. Но если я хочу заглянуть внутрь элементов списка, а не только на все элементы, как я могу сделать для этого метод Pythoninc?
Например, при
l = ['the cat ate the mouse',
'the tiger ate the chicken',
'the horse ate the straw']
эта функция вернет 1
с аргументом tiger
.
Непрозрачный метод:
def index_containing_substring(the_list, substring):
for i, s in enumerate(the_list):
if substring in s:
return i
return -1
Изменение решения 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(l, s):
for i in range(len(l)):
if l[i].find(s)!=-1:
return i
return None # Or -1
Это довольно гладкий и довольно эффективный.
>>> 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, если элемент не найден (хотя это легко исправляется).
Вы можете использовать следующий однострочный:
index = [idx for idx, s in enumerate(l) if 'tiger' in s][0]
def first_substring(strings, substring):
return min(i for i, string in enumerate(strings) if substring in string)
Примечание. Это приведет к повышению ValueError
в случае, если совпадение не найдено, что лучше, на мой взгляд.
>>> 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