2013-04-09 88 views
2

我想在T1中读取并将它写为T2(注意两者都是.csv)。 T1包含重复的行;我不想在T2中重复写入。Filter-Out重复表条目

T1

+------+------+---------+---------+---------+ 
| Type | Year | Value 1 | Value 2 | Value 3 | 
+------+------+---------+---------+---------+ 
| a | 8 | x  | y  | z  | 
| b | 10 | q  | r  | s  | 
+------+------+---------+---------+---------+ 

T2

+------+------+---------+-------+ 
| Type | Year | Value # | Value | 
+------+------+---------+-------+ 
| a | 8 | 1  | x  | 
| a | 8 | 2  | y  | 
| a | 8 | 3  | z  | 
| b | 10 | 1  | q  | 
| ... | ... | ...  | ... | 
+------+------+---------+-------+ 

目前,我有这样的速度奇慢的代码过滤掉重复:

no_dupes = [] 

for row in reader: 
    type = row[0] 
    year = row[1] 
    index = type,age 
    values_list = row[2:] 

    if index not in no_dupes: 
     for i,j in enumerate(values_list): 
      line = [type, year, str(i+1), str(j)] 
      writer.writerow(line) #using csv module 
      no_dupes.append(index) 

我不能exagerate这个代码是如何缓慢时,T1变大。

当我写入T2时,是否有更快的方式从T1中过滤出重复项?

+0

在最低限度,要添加每次在循环中将'index'指向'no_dupes'列表。因此:(1)将'no_dupes'改为'set'并且(2)在每个循环中仅将'index'添加到'no-dupes'一次。 – hughdbrown 2013-04-09 19:45:12

回答

4

我想你想是这样的:

no_dupes = set() 

for row in reader: 
    type, year = row[0], row[1] 
    values_list = row[2:] 

    for index, value in enumerate(values_list, start=1): 
     line = (type, year, index, value) 
     no_dupes.add(line) 

for t in no_dupes: 
    writer.writerow(t) 
+0

谢谢!这实质上更快。 – ABM 2013-04-09 20:14:49

0

如果可能的话转换读者一组和迭代设置相反,那么就没有了DUP可能性

+0

我不能使用csv.reader();阅读器中的每一行都是一个列表。 – ABM 2013-04-09 19:40:28