2014-10-20 2 views
3

У меня есть список, который может содержать несколько элементов разных типов. Мне нужно проверить, есть ли в этом списке один или несколько элементов определенного типа и получить его индекс.Найти элемент в списке по типу

l = [1, 2, 3, myobj, 4, 5] 

я могу достичь этой цели, просто перебрать свой список и проверить тип каждого элемента:

for i, v in enumerate(l): 
    if type(v) == Mytype: 
    return i 

есть более вещий путь для достижения того же результата?

+0

ли вам нужны индексы всех элементов этого типа, или только первый ? – BrenBarn

+0

@BrenBarn В моем конкретном случае мне нужен только первый, но было бы оценено «общее» решение. – Nick

+0

Вы можете использовать понимание или генератор exp - однако это означало бы, что вам нужно пройти весь список, чтобы увидеть, есть ли по крайней мере один. Ваш метод более эффективен для ИМО. – karthikr

ответ

6

Вы можете использовать next и generator expression:

return next(i for i, v in enumerate(l) if isinstance(v, Mytype)): 

Преимущество этого решения заключается в том, что он ленив, как ваш текущий один: он будет только проверить, как много элементов, которые необходимы.

Кроме того, я использовал isinstance(v, Mytype) вместо type(v) == Mytype, потому что это предпочтительный метод проверки типов в Python. См. PEP 0008.

Наконец, следует отметить, что это решение вызовет исключение StopIteration, если нужный элемент не найден. Вы можете поймать это с Try/за исключением, или вы можете указать значение по умолчанию для возврата:

return next((i for i, v in enumerate(l) if isinstance(v, Mytype)), None): 

В этом случае None будут возвращены, если ничего не найдено.

+0

И как я могу получить индекс элемента таким образом? – Nick

+0

@ Ник - Извините, я неправильно понял ваш вопрос. См. Мое редактирование. – iCodez

0

Вы можете использовать список.

Получить все элементы типа строки:

b = [x for x in a if isinstance(x,str)] 

Получить все индексы элементов типа строки:

b = [x[0] for x in enumerate(a) if isinstance(x[1],str)] 
Смежные вопросы