2017-10-15 19 views
0

重複ルールを定義:列の値は、私はのように行0および2を認識するための方法を探しています行1と3を切り替えるだけでなく、しているPythonは私が次の表持つ

index col_A col_B 

0 John Jones 
1 Perez Mark 
2 Jones John 
3 Mark Perez 
4 Albert Perez 

行0および2を行1と行3も重複として重複しています。次に、重複を削除して、一意的な出現のうちの1つだけを保持したいと思います。したがって結果の行列は3行2列(行4は重複がないため)でなければなりません。ネストされたループを使用せずにこれを行う効率的な方法はありますか(私のテーブルには3百万以上の行があります)?ありがとう

+0

使用しているデータベースエンジンは? – youngminz

+0

@youngminz:CSVファイルです –

+0

これは効率的なアルゴリズムになります 1:すべてのデータをメモリに読み込み2:Sort col_A and col_B 3)データをソートする==> O(N log_2 N)4)重複を見つける==> O( N) – youngminz

答えて

1

setを使用して、すでに追加された要素を覚えておくことができます。何かのように

a = [(0, 'John', 'Jones'), (1, 'Perez', 'Mark'), (2, 'Jones', 'John'), (3, 'Mark', 'Perez'), (4, 'Albert', 'Perez')] 

res = [] 

already_added = set() 

for e in a: 
    key1, key2 = e[1]+e[2], e[2]+e[1] 
    if key1 not in already_added and key2 not in already_added: 
     res.append(e) 
     already_added.add(key1) 

res 
Out[37]: [(0, 'John', 'Jones'), (1, 'Perez', 'Mark'), (4, 'Albert', 'Perez')] 
+1

'already_added | = set([key1]) 'を使用しないで、' already_added .add(key1) ' –

+0

@ juanpa.arrivillagaコメントありがとう、私は私の答えを修正します – kvorobiev

+0

@kvorobievとjuanpa.arrivillaga:ありがとう!それは素晴らしい作品です。それは15分以上かかりましたが、私はそれがテーブルの大きさを考えると、最も速いオプションだと思います。もう一度ありがとう –

0

簡単で効率的な方法は、DBMSを作成することです。 sqlite3では、次のようなものが動作します。

DELETE FROM table WHERE id NOT IN (SELECT max(id) FROM table GROUP BY col_A,col_B) 
関連する問題