2017-10-15 109 views
0

我有如下表: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。我正在尋找一種方式來識別行0和2重複,第1行和第3行也是重複的。然後,我想刪除重複項並只保留其中一個唯一的事件。所以得到的矩陣應該是3乘2(因爲第4行沒有重複)。有沒有一種有效的方式來做到這一點,而不使用嵌套循環(我的表有超過3百萬行)?由於

+0

你正在使用什麼數據庫引擎? – youngminz

+0

@youngminz:這是一個csv文件 –

+0

這將是有效的算法 1:讀取所有數據到存儲器2:排序爲col_a和col_B 3)分類DATAS ==> 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 | =集合([鍵1])',只要使用'already_added 。新增(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)