Простая, гибкая однострочная версия:
[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a']
# returns [0, 2]
[i for (i, item) in enumerate([('a', 1), ('b', 3), ('a', 5)]) if item[0] == 'a'][0]
# returns 0
Вы можете обернуть его в функцию, заменить item[0] == 'a'
вызовом произвольного предиката (как в моем исходном ответе; вот где он гибок) и т. Д. Вторая версия выше выдает исключение, если элемент не найден так что заверните его в try / исключением; первый вернет пустой список.
Если вы предпочитаете отдельную функцию для работы, ознакомьтесь с приведенной ниже ... Она имеет преимущество в том, что потребляет только столько итераций, сколько необходимо , чтобы найти подходящий элемент.
Оригинальный ответ:
Это позволит вам найти индекс первого элемента, обладающего любым свойством, о котором вы только можете подумать, хотя вам нужно будет выразить его как функцию (для вашего примера достаточно lambda x: x[0] == 'a'
):
def index_by(pred, iterable):
i = 0
found = False
for item in iterable:
if pred(item):
found = True
break
i += 1
return i if found else None
Звоните так:
index_by(lambda x: x[0] == 'a', [('b', 1), ('a', 5)]) # returns 1
чтобы получить нулевой индекс первого элемента в итерируемой, который удовлетворяет данному предикату. (Другими словами, первый элемент в итерируемом элементе передается как второй аргумент, для которого функция, переданная в качестве первого аргумента, возвращает истинное значение.)
Если итеративный элемент не содержит элемент, удовлетворяющий предикату, возвращается None
.