在嵌套for循环中获取迭代计数器

时间:2012-11-01 16:45:14

标签: python

我想要一个计数器来统计我已经完成了多少次迭代。 我这样做:

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

但我不禁要问有更多的pythonic方法吗?

3 个答案:

答案 0 :(得分:4)

它简单易读,就像Pythonic一样(除了冒号外)。

如果您开始在这些循环中添加更多代码,我唯一的建议就是提供ij个更具描述性的名称。

答案 1 :(得分:2)

我会说最pythonic的方法是记录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)

答案 2 :(得分:1)

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

正如Codemonkey所指出的那样,我们并没有在这里增加可读性,而且对于明确使用的说法,它并不是真正的改进。但是,enumerate和itertools.product表达式都是生成器/迭代器,因此可以将它们传递给其他函数,例如map,以便在那里使用。因此,您可以过滤项目和其他项目的相同值:

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

现在sameys与allelements具有完全相同的结构。关键是整个可迭代集成为迭代器表达式,而不是循环结构,可以更容易地传递。