我想要一个计数器来计算我总共完成了多少次迭代。我愿意:
counter = 0;
for i, item in enumerate(items):
for j, anotheritem in enumerate(anotheritems):
counter += 1;
但我不禁要问有没有更蟒蛇的方式?
我想要一个计数器来计算我总共完成了多少次迭代。我愿意:
counter = 0;
for i, item in enumerate(items):
for j, anotheritem in enumerate(anotheritems):
counter += 1;
但我不禁要问有没有更蟒蛇的方式?
它简单易读,就像它得到的 Pythonic 一样(除了分号。)
如果您开始将更多代码放入这些循环中,我唯一的建议是给出更具描述性i
的名称。j
我想说最pythonic的方法是记录i
而j
不是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)
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
. 关键是整个可迭代集变成了一个迭代器表达式,而不是一个循环构造,它可以更容易地传递。