2017-07-17 64 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