3

これはまともな Python 開発者にとっては簡単なことだと思います - 私はまだ学んでいます! 重複した電子メールを含むcsvを指定すると、重複した電子メールの数を繰り返して書き出すことができます。

infile.csv

COLUMN 0
some@email.com
some@email.com
another@address.com
example@email.com

出力ファイル.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] )

しかし、カウントを新しい列に書き込むのに問題があります。

4

3 に答える 3

4

Python2.6 でのdefaultdictwhich使用

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)
于 2012-08-28T02:07:47.480 に答える
3

カウンターを試してください。それはそのような使用のために設計されています:

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を書き留めたりしなかったことに注意してください。これは簡単です。

于 2012-08-28T01:24:43.993 に答える
1

Python 2.6 では、ピジョンホール ソートのようなものを試すことができます: http://en.m.wikipedia.org/wiki/Pigeonhole_sort

実際には、まさにこの種類の問題のために作られています。

実際のセットアップでは、情報を書き出すのではなく、辞書を使用してデータを保持し、それを反復処理します。

于 2012-08-28T02:08:06.137 に答える