我认为这对于一个体面的Python开发来说很容易 - 我还在学习!给定一个带有重复电子邮件的csv,我想迭代并写出重复电子邮件的数量,例如:
infile.csv
COLUMN 0
some@email.com
some@email.com
another@address.com
example@email.com
outfile.csv
COLUMN 0 COLUMN 1
some@email.com 2
another@address.com 1
example@email.com 1
到目前为止,我可以使用
删除重复项import csv
f = csv.reader(open('infile.csv','rb'))
writer = csv.writer(open('outfile.csv','wb'))
emails = set()
for row in f:
if row[0] not in emails:
writer.writerow(row)
emails.add( row[0] )
但是我无法将计数写入新专栏。
答案 0 :(得分:4)
在Python2.6中使用 的defaultdict
from collections import defaultdict
# count all the emails before we write anything out
emails = defaultdict(int)
for row in f:
emails[row[0]] += 1
# now write the file
for row in email.items():
writer.writerow(row)
答案 1 :(得分:3)
尝试counter。它专为此类用途而设计:
from collections import Counter
emails=Counter()
for row in f:
emails+=Counter([row[0]])
打印:
Counter({'some@email.com': 2, 'another@address.com': 1, 'example@email.com': 1, 'COLUMN 0': 1})
从计数器中获取任何其他数据结构很容易:
print set(emails.elements())
# set(['another@address.com', 'COLUMN 0', 'example@email.com', 'some@email.com'])
请注意,我没有跳过标题或写出csv - 这很容易做到。
答案 2 :(得分:1)
对于Python 2.6,您可以尝试类似于鸽子类的东西: http://en.m.wikipedia.org/wiki/Pigeonhole_sort
这实际上是针对这种确切的问题而制作的。
对于实际设置,使用字典来保存数据然后迭代它,而不是在你去的时候尝试写出信息。