1

我想要一个计数器来计算我总共完成了多少次迭代。我愿意:

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

但我不禁要问有没有更蟒蛇的方式?

4

3 回答 3

4

它简单易读,就像它得到的 Pythonic 一样(除了分号。)

如果您开始将更多代码放入这些循环中,我唯一的建议是给出更具描述性i的名称。j

于 2012-11-01T16:47:53.893 回答
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)
于 2012-11-01T17:18:33.573 回答
1
for counter,ijpair in enumerate(itertools.product(enumerate(items),enumerate(other))):
    i,j = ijpair
    //... do stuff

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

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

而现在,sameys 的结构与allelements. 关键是整个可迭代集变成了一个迭代器表达式,而不是一个循环构造,它可以更容易地传递。

于 2012-11-01T16:48:31.333 回答