python - 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 文件合并,这就是为什么
非常感谢,
解决方案
正如已经回答的那样,问题在于它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)
推荐阅读
- regex - 如何在颤动中显示正则表达式结果
- ios - 在单元格容器内部/外部的单元格内容上拖动动画
- c# - Asp .net Core 使用服务实例调用在 Startup.cs 中运行的另一个方法中的方法
- javascript - 滚动到另一页并打开部分
- c# - 在 HttpResponseMessage 中返回任何内容都不会导致服务器端 Web 服务调用延迟
- java - JavaFX 在 FX 应用程序线程之外的另一个线程中运行 WebEngine
- azure-cosmosdb - CosmosDB:如何在插入文档时应用并发(并行请求)
- vb.net - 疯狂随机化 MS Access 查询
- c# - 为什么我不能使用包含参数的 List 来调用 C# 中的方法?
- android - 界面上的 Kotlin 扩展