首页 > 解决方案 > Python简单的嵌套循环

问题描述

我正在尝试做一些非常简单的事情:我有一个重复的 csv 文件,其中可能有重复的电子邮件,我需要找出每封电子邮件重复的次数,所以我做了如下操作:

file = open('click.csv')
reader = csv.reader(file)

for row in reader:
    email = row[0]
    print (email) # just to check which value is parsing
    counter = 1
    for row in reader:
        if email == row[0]:
            counter += 1
            print (counter) # just to check if it counted correctly

它只打印出来:

第一个电子邮件地址

2

实际上,第一封电子邮件有 2 次发生,但不知何故,这在 csv 文件中的第一封电子邮件之后停止了。

所以我将其简化为

for row in reader:
   email = row[0]
   print (email)

这确实会打印出 csv 文件中的所有电子邮件地址

这是一个简单的嵌套循环,那么这里有什么问题呢?

当然,无需脚本就可以只检查发生情况,但是我必须处理那些与它们相关的电子邮件和数据,并将其与另一个 csv 文件合并,这就是为什么

非常感谢,

标签: pythoncsvnested-loops

解决方案


正如已经回答的那样,问题在于它reader是一个迭代器,所以它只适用于单次传递。您可以将所有项目放在一个容器中,例如列表。

但是,您只需要一次通过即可计算事物。使用dict最基本的方法是:

counts = {}
for row in reader:
    email = row[0]
    if email in counts:
        counts[email] = 1
    else:
        counts[email] += 1

甚至还有更清洁的方法。例如,使用一个专门用于计数的collections.Counter对象:dict

import collections
counts = collections.Counter(row[0] for row in reader)

甚至:

counts = collections.counter(email for email, _* in reader)

推荐阅读