2012-11-01 4 views
0

총 카운터 수를 계속 유지하도록 카운터를 원합니다. 내가 할 :중첩 된 for 루프의 반복 카운터 얻기

counter = 0; 
for i, item in enumerate(items): 
    for j, anotheritem in enumerate(anotheritems): 
     counter += 1; 

하지만 더 파이썬 방법이 요구 도울 수 없어요?

+8

더 파이썬 방법은 동일 할 것이지만, 세미콜론 : –

답변

4

은 그게 (세미콜론 그렇다.)수록 파이썬으로

내 유일한 조언은 당신이 그에 더 많은 코드를 넣어 시작하는 경우 ij보다 설명적인 이름을 부여하는 것입니다 관하여, 간단하고 읽을 수 있어요 루프. Codemonkey가 지적 하듯이

1
for counter,ijpair in enumerate(itertools.product(enumerate(items),enumerate(other))): 
    i,j = ijpair 
    //... do stuff 

, 우리는 여기에 가독성을 증가하지 않는, 그리고 언급 된 명시 적 사용, 정말 개선이 아니다. 그러나 enumerate 및 itertools.product 표현식은 모두 생성자/반복기이므로 map과 같은 다른 함수로 전달하여 사용할 수 있습니다. 그래서 당신은 항목 otheritem가 같은 값이었다 어디를 필터링 할 수 :

allelements = itertools.product(items, others) 
sameys = itertools.ifilter(lambda a: a[0]==a[1], allelements) 

그리고 지금 sameys는 allelements와 완전히 동일한 구조를 가지고있다. 핵심은 iterable 세트 전체가 루프 구조가 아니라 반복자 표현이되어보다 쉽게 ​​전달할 수 있다는 것입니다.

+2

없이 나는 * 덜 읽을 *만큼 그 * 더 파이썬 *를 호출하지 것이다. – Hubro

+0

iterator는 무한 할 수 있으며, 'flat is nested'보다 우수합니다. itertools는 Python에 포함 된 배터리 중 하나입니다 (제품은 v2.6). 하지만 그렇습니다. 읽기가 쉽지 않습니다. –

+0

또한 조합, 교체 등의 조합으로 전환하기가 쉽습니다. –

1

내가 가장 파이썬 방법은 튜플 (i,j)count보다 훨씬 더 많은 의미를 가지고 있기 때문에, count보다는 ij을 기록하는 것입니다 말할 것이다 - 당신이 (i,j)에서 수를 계산할 수 있습니다!

for i, item in enumerate(items): 
    for j, anotheritem in enumerate(anotheritems): 
     where_i_am = (i,j) 
     # count = i*len(anotheritems) + j + 1 

total_iterations = len(items) * len(anotheritems) # equivalently (i+1) * (j+1)