我想要一个计数器来保持计数我总共完成了多少次迭代。我愿意:
counter = 0;
for i, item in enumerate(items):
for j, anotheritem in enumerate(anotheritems):
counter += 1;
但是我不禁要问有更多的pythonic方法吗?
它很简单且可读性,它的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指出的那样,我们在这里没有提高可读性,并且为了明确说明,这并不是真正的改进。但是,枚举和iTertool。产品表达式都是生成器/迭代器,因此它们可以传递给其他功能,例如在那里使用的MAP。因此,您可以在任何何处过滤和其他列的值相同的值:
allelements = itertools.product(items, others)
sameys = itertools.ifilter(lambda a: a[0]==a[1], allelements)
现在,Sameys具有与allelements
完全相同的结构。关键是整个峰值集成为迭代器的表达式,而不是成为循环结构,可以更容易地传递。