2016-07-07 8 views
0

2to3 도구를 사용하여 Py2 -> Py3에서 많은 스크립트를 이식하는 중입니다. 하나 명의 특별한 제안 된 변경은 나에게 약간의 혼란, 그래서 나는 그 몇 가지 도움이 감사하겠습니다 :Python 2to3, 조건부로리스트 반복 (필터 대리스트 이해)

원래 라인은 다음과 같습니다

for r in filter(lambda r: r.dir == direction, hm_regions): 
    ... # do stuff with r 

hm_regions는 속성이 dir라고 나는 반복이 루프를 사용하여이 namedtuples 보유를 주어진 방향 매개 변수와 일치하는 것보다

제안 된 변화는 내가 이론적으로 결과가 전혀 변경하지 않아야하므로이 본질적으로 같은 일을 이해

for r in [r for r in hm_regions if r.dir == direction]: 

입니다 (시도하지 않은). 그러나 double for 루프가 매우 추한 것을 알았습니다. 그리고이 반복을 수행하는 가장 예쁜, 가장 우아한 방법은 아닌 것 같습니다.

나는 또한 for r in hm_regions if r.dir == direction:을 시도해 보았습니다.이 오류는 구문 오류로 인해 실패했습니다. 이것은 다소 불만이었습니다.

편집 : 또 다른 질문은 전혀 변경하지 않는 것입니까? 제안 된 변경에 대한 근본적인 동기는 filter이 더 이상 목록을 반환하지 않는다는 것입니다. 그러나이 맥락에서 나는 그것을 반복하는 것 이상으로 목록을 사용하지 않는다. 따라서 그것은 잘 작동 할 것입니다, 그렇죠?

+0

필터링 속도가 느립니다. [이 링크] (http://stackoverflow.com/questions/3013449/list-filtering-list-comprehension-vs-lambda-filter)를 참조하십시오. – chrislessard

답변

0

그러나 나는 루프를위한 두 배를 매우 못생긴 것으로 생각하며,이 반복을 수행하는 가장 예쁜, 가장 우아한 방법은 아닌 것 같아요. 제안 사항?

를 사용하여 간단한 if는 :

for r in hm_regions: 
    if r.dir == direction: 
     # do stuff 

또는

for r in hm_regions: 
    if r.dir != direction: 
     continue 
    # do stuff 
0

나는 한 줄의 루프 두 가지가 볼 수있는 가장 즐거운 일이 아니라는 것을 동의하지만, 나는 않을 것 솔루션을 너무 많이 overthink. 일부 옵션 :

1), 지능형리스트를 유지에 deadset있어 두 줄에 그것을 깰 경우

lst = [r for r in hm_regions if r.dir == direction] 
for item in lst: 
    ... 

2) 당신이 틈을 파고 괜찮다면, 루프 내 경우 사용 이해 :

for r in hm_regions: 
    if r.dir == direction: 
     ... 

편집 : this link을 확인하고 싶을 수도 있습니다. 생성기가 좋은 대안 일 수도 있지만 코드 컨텍스트에 따라 다릅니다.