2012-11-01 110 views
0

我想要一個計數器來保持計算總共完成了多少次迭代。 我做的:在嵌套for循環中獲取迭代計數器

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

但我不禁會問有沒有更Python的方式?

+8

更Python的方式是相同的,但沒有分號:) –

回答

4

它的簡單性和可讀性,這是我們所Python的,因爲它得到(除了分號。)

我唯一的建議是,如果你開始把更多的代碼到這些給ij更具描述性的名稱循環。

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

由於Codemonkey所指出的,我們這裏沒有增加可讀性,並規定了明確的使用,它不是一個真正的改善。然而,枚舉和itertools.product表達式都是生成器/迭代器,所以它們可以傳遞給其他函數,如地圖在那裏使用。所以,你可以篩選哪裏的項目,並otheritem是相同的值:

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

現在sameys具有完全相同的結構allelements。關鍵是整個迭代集合成爲一個迭代器表達式,而不是一個循環結構,它可以更容易傳遞。

+2

我不認爲這是*更Python *儘可能少* *可讀性。 – Hubro

+0

沒有'counter',迭代器可以是無限的,它符合'flat比嵌套'Zen要好,itertools是Python中包含的一個電池(產品是v2.6)。但是,是的,閱讀起來不那麼「簡單」。 –

+0

它也很容易切換到組合,替換等組合等 –

1

我想說的最Python的方式是記錄ij而非count,因爲元組(i,j)有更多的意義比count - 你可以從(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)