2016-12-06 1 views
-1

다음과 같은 두 가지 기능이 있습니다.목록에있는 목록을 파이썬에서 목록으로 가져 오기

목록 이해를 통해 취해진 색인이 처음으로 일치하는 것으로 보이므로 다른 색인에서 같은 값을 가질 때 모호한 점이 있습니다.

filter2에서 목록 이해력을 수정할 수있는 방법이 있습니까? filter1과 같은 결과가 나옵니까?

L = [98.75011926342906, 
97.8178200008178, 
98.6138182016438, 
98.55520874507613, 
98.25262038791283, 
98.75011926342906, 
99.06770073738875, 
98.66970163697574, 
98.56611283001895, 
98.47751713985852, 
98.66970163697574, 
97.8178200008178] 


def filter1(L, threshold=98.7): 
    items = [] 
    for i in range(len(L)): 
     if L[i] < threshold: 
      items.append(i) 
    return items 

def filter2(L, threshold=98.7): 
    items = [L.index(x) for x in L if x <= threshold] 
    return items 

print filter1(L) 
>>> [1, 2, 3, 4, 7, 8, 9, 10, 11] 
print filter2(L) 
>>> [1, 2, 3, 4, 7, 8, 9, 7, 1] 
+0

향후 작은 비트에주의하십시오. 제 말은'filter1'에서'<'sign을 사용하고,'filter2'에서'<='를 사용한다는 것입니다. 이 두 필터는 서로 다른 논리를 사용하기 때문에 결과도 다릅니다. 'index'는 발견 된 첫 번째 색인의 값을 반환합니다 (즉, 결함이있는 곳). –

답변

4

현재 도우미로 enumerate를 사용할 수 있습니다

bad_items = [i for i, x in enumerate(L) if x <= threshold] 

enumerate는 당신에게 당신이 (i, x로) 이해
에 압축을 풀 수 있습니다 (index, value)의 쌍을 줄 것이다. 다음 x <= threshold 경우에만 i 가져 가라.

+1

나는 당신이 '나는 열거한다 (L)'를 의미한다고 생각한다. –

3

중복되는 요소가 있고 인덱스가 값이있는 가장 작은 인덱스를 반환하기 때문에 10 대신 인덱스 7이있는 이유가 있습니다. 게다가 색인을 검색하는데도 선형 시간이 걸립니다. 전체 루프가 2 차적입니다.

0

루프의 위치를 ​​i로 지정하는 enumerate를 사용할 수 있습니다. x는 현재 값으로 할당됩니다.

def filter2(L, threshold=98.7): 
    items = [i for (i, x) in enumerate(L) if x <= 98.7] 
    return items 
관련 문제