2014-10-20 3 views
3

다른 유형의 여러 요소가 포함될 수있는 목록이 있습니다. 이 목록에 특정 유형의 요소가 하나 이상 있고 색인이 있는지 확인해야합니다. 동일한 결과를 달성하기 위해 더 파이썬 방법은유형별 목록에서 항목 찾기

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

있습니까 : 단순히 내 목록을 반복하고 각 요소의 종류를 확인하여

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

나는이 목표를 달성 할 수 있습니까?

+0

하면 해당 유형의 모든 요소의 인덱스, 또는 단지 첫 번째가 필요하십니까 :

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

유형 문자열의 모든 요소 인덱스를 가져 오기 :

하는 타입 캐릭터의 모든 요소를 ​​가져옵니다 ? – BrenBarn

+0

@BrenBarn 필자의 경우에는 첫 번째 경우 만 필요하지만 "일반적인"해결책은 인정 될 것입니다. – Nick

+0

당신은 이해력이나 생성자 exp를 사용할 수 있습니다 - 그러나 이것은 당신이 전체 목록을 거쳐야 가장 많은 것이 있는지 알아야 함을 의미합니다. 귀하의 방법은 IMO보다 효율적입니다. – karthikr

답변

6
당신은 next을 사용할 수 있습니다

generator expression :

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

이 솔루션의 장점은 같은 게으른 때문이다 현재 하나를 필요로 만 많은 항목을 확인합니다.

또한 type(v) == Mytype 대신 isinstance(v, Mytype)을 사용했습니다. 이는 파이썬에서 형식 검사의 선호되는 방법이기 때문입니다. PEP 0008을 참조하십시오.

마지막으로이 솔루션은 원하는 항목을 찾을 수없는 경우 StopIteration 예외를 발생시킵니다. 당신은 제외/시도로이 잡을 수, 또는 당신은 기본 값을 반환하도록 지정할 수 있습니다 아무 것도 발견되지 않으면

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

, None가 반환됩니다.

+0

그리고 어떻게이 방법으로 요소의 색인을 얻을 수 있습니까? – Nick

+0

@ 닉 - 죄송합니다. 질문을 잘못 읽었습니다. 내 편집을 참조하십시오. – iCodez

0

목록 이해를 사용할 수 있습니다.

b = [x[0] for x in enumerate(a) if isinstance(x[1],str)] 
관련 문제