2013-10-13 3 views
1

이 조건 집합을 이해하는 방법이 있습니까?중첩 루프 및 조건을 목록 이해로 변환

clamp_sel = list() 
for i in range(0, len(clamp_normalized)): 
     for j in range(0, len(clamp_normalized[i])): 
       if clamp_normalized[i][j][0] < int(max_min_band[index_selec]): 
         clamp_sel.append(int(clamp_normalized[i][j][0])) 

단일 차원 목록 인 경우이 방법으로 조건을 설정할 수 있습니다.

norm_sel = [i for i in normalize_data if i[0] > max_min_band[index_selec]] 

감사

답변

4

이 목록-이해에 직접 번역한다 :

clamp_sel = [int(clamp_normalized[i][j][0]) 
    for i in range(0, len(clamp_normalized)) 
    for j in range(0, len(clamp_normalized[i])) 
    if clamp_normalized[i][j][0] < int(max_min_band[index_selec])] 

일반적인 규칙이다 (참조 manual) 정확히 같은의 목록-이해를 작성해야하는 순서는 일련의 중첩 된 for 루프 및 if 문과 동일합니다. 당신이 바꾸는 유일한 방법은리스트을 목록 보완의 앞부분에 단지 yy으로 바꾸는 것입니다. 또한 이것은 매우 긴 행에 작성할 수있는 본질적으로 긴 표현식입니다. 닫는 경우 []이므로 임의의 들여 쓰기를 사용하여이 표현식을 여러 줄로 나눌 수 있습니다.

목록 이해가 더 많은 경우 pythonic보다 맛의 질문입니다. 이 경우 중첩이 간단하므로 개인적으로 목록 이해를 위해 이동합니다. 좀 더 복잡 해지면 for-loops를 사용하십시오.

눈에 띄는 것처럼이 예제는 range()을 목록에 직접 반복하여 사용하면 더 간단해질 수 있습니다.

+0

는 복잡하지만 목록 이해력은 적습니다. –

+0

@GamesBrainiac : lamda를 사용하여 향상시킬 수 있습니까? – pistal

+0

@pistal 그렇게 생각하지 않습니다. 당신은 많은 루핑을하고 있습니다. 그렇습니다. –

5

clamp_normalized이 목록 목록 인 경우 색인이 필요하지 않으면 range을 사용하지 않고 반복 할 수 있습니다.

clamp_sel = [j[0] 
        for i in clamp_normalized 
        for j in i 
        if j[0] < int(max_min_band[index_selec])]