2017-07-17 67 views
1

問題我用以下方式以CSV 120000行:重新排序重複的聯繫人。與名單

ID Duplicate 
1 65 
2 67 
4 12 
4 53 
4 101 
12 4 
12 53 
101 ... 

這份名單基本上指定了許多用戶ID的,哪些是該用戶的重複用戶。如何由該列表現在我真的不能在Excel中篩選了這一點,所以我想用這個結果來改造列表:

[1, 65] 
[2, 67] 
[4, 12, 53, 101] 

之後我就可以寫入到一個新的CSV只刪除列表[ 0],這樣我就可以爲每個「重複的用戶塊」保留一個用戶。在Excel中,我會刪除所有剩餘的用戶ID。

但是來到這一點,我有幾個問題:

import csv 

with open("contacts.csv", "rt") as f: 
    reader = csv.reader(f, delimiter="\t") 

    contacts = [] 
    for row in reader: 
     if row[0] not in contacts: 
      contacts.append(row[0]) 
     if row[1] not in contacts: 
      position = contacts.index(row[0]) 
      contacts[position].append(row[1]) 

當然我得到的錯誤「AttributeError的:‘海峽’對象有沒有屬性‘追加’」聯繫人[位置]是一個串。但是,如何更改代碼,以便獲取每個重複聯繫人塊的列表?

謝謝!

+0

爲什麼** 101 **在輸出中不遵循** 53 **? –

+0

是第一列排序? – Gribouillis

+0

你是對的,編輯它。是的,第一列是排序 – user2252633

回答

1

有一個在標準Python幾乎是一個內襯太

import csv 
from itertools import groupby 

with open("contacts.csv", "rt") as f: 
    reader = csv.reader(f, delimiter="\t") 
    contacts = [[k] + [r[1] for r in g] for k, g in groupby(reader, key=lambda row: row[0])] 

我也很喜歡熊貓的解決方案,但它意味着學習一種新的API。

+0

謝謝!與之前的解決方案有同樣的問題。最終目標是從每個「重複用戶塊」中保留一位用戶。在你的解決方案的輸出中,例如獲得['3001464','3001465'],['3001465','3001464'](真實文件!)。如果我刪除每個列表中的第一個元素以獲取重複的元素,這不會起作用;)任何想法?在上面給出的列表中: [1,65] [2,67] [4,12,53,101] 我想刪除1,2和4,所以我可以告訴Excel來過濾所有用戶65,67,12,53和101,從而保留一個原始不重複的用戶。 – user2252633

+0

@ user2252633您正在查找圖表*的連接組件。有關於這個的線程,例如這個https://stackoverflow.com/questions/10301000/python-connected-components。您也可以使用內置函數的外部庫,例如networkx或igraph。 – Gribouillis

1

這會工作,即使您的CSV文件沒有排序,如果你錯過了幾個項目:

with open('contacts.csv') as infile: 
    data = {} 
    for i,dup in csv.reader(infile): 
     if i not in data: 
      if dup in data: 
       data[i] = data[dup] 
       continue 

      data[i] = set((i, dup)) 
      data[dup] = data[i] 
      continue 

     data[i].add(dup) 

for _,dups in data.items(): 
    print(sorted(dups)) 

UPDATE:如果你想避免打印多套重複的:

for k,dups in list(data.items()): 
    if k not in data: continue 
    print(sorted(dups)) 
    for d in dups: data.pop(d) 
+0

我收到此錯誤:回溯(最近一次調用最後一次): 文件「duplicate.py」,第5行,在 for i,dup in csv.reader(infile): ValueError:沒有足夠的值解包2,得到1)可能是與CSV文件的東西..我有一個行之間的兩個值之間的空間,然後一個新的行..任何指針? – user2252633

+0

@ user2252633:這似乎是一個錯誤,導致您的文件末尾出現空行。刪除應該修復它。或者如果你的csv文件在某個時候停止逗號分隔,那麼這也可能導致這個錯誤 – inspectorG4dget

+0

嗯,仍然不起作用,嘗試了你提到的兩件事。我也節約了CSV不同,讓我得到了每個數字之間用逗號:聯繫NO_,重複的聯繫人NO_ 1000004,1000588 1000009,1000489 1000009,1000531 1000009,1000643 只有現在我得到:回溯(最近電話最後): 文件「duplicate.py」,第17行,在 爲_,嘟嘟在數據中: ValueError:太多值解壓(預計2) – user2252633