2013-07-08 3 views
0

Я пытаюсь удалить повторяющиеся записи из данных, которые выглядят следующим образом:Ошибка: в списке нет атрибута add()?

name phone email website 
Diane Grant Albrecht M.S.   
Lannister G. Cersei M.A.T., CEP 111-222-3333 [email protected] www.got.com 
Argle D. Bargle Ed.M.   
Sam D. Man Ed.M. 000-000-1111 [email protected] www.daManWithThePlan.com 
Sam D. Man Ed.M.    
Sam D. Man Ed.M. 111-222-333  [email protected] www.daManWithThePlan.com 
D G Bamf M.S.   
Amy Tramy Lamy Ph.D.    

Так что это выглядит следующим образом:

name phone email website 
Diane Grant Albrecht M.S.   
Lannister G. Cersei M.A.T., CEP 111-222-3333 [email protected] www.got.com 
Argle D. Bargle Ed.M.   
Sam D. Man Ed.M. 000-000-1111, 111-222-333 [email protected] www.daManWithThePlan.com 
D G Bamf M.S.   
Amy Tramy Lamy Ph.D.  

Вот мой код:

from collections import defaultdict 
import csv 
import re 

input = open('ieca_first_col_fake_text.txt', 'rU') 

# default to empty set for phone, email, website, area, degrees 
extracted_data = defaultdict(lambda: [set(), set(), set()]) 

for row in input: 
    for index, value in enumerate(row):  
     name = row[0] 
     data = extracted_data[name].add(row) 

for row in data: print row 

I получить эту ошибку:

AttributeError: 'list' object has no attribute 'add' 
logout 

UPDATE:

from collections import defaultdict 
import csv 
import re 

input = open('ieca_first_col_fake_text.txt', 'rU') 
input_r = csv.reader(input, delimiter = '\t') 

# default to empty set for phone, email, website, area, degrees 
extracted_data = defaultdict(lambda: [set(), set(), set()]) 

data = [] 

# Index on the name and then for that name add the rest of the information. 
for row in input_r: 

    data_set = extracted_data[row[0]] 
    for index, value in enumerate(row[1:]): 
     data_set[index].add(value) 

print data_set 

выход:

[set(['']), set(['']), set([''])] 
logout 

ответ

3

extracted_data значения списки из 3 сетов в каждом:

extracted_data = defaultdict(lambda: [set(), set(), set()]) 

Вам нужно более внимательно прочитать предыдущий ответ и выбрать правый набор для вызова .add() on.

Предыдущий ответ петля более 4 элементов в строке ввода, используют первый элемент, чтобы найти список наборов, и добавляет каждый из остальных 3-х элементов этих множеств:

for index, value in enumerate(split(entry)): 
    if index == 0: 
     data_set = extracted_data[name] 
    elif value: 
     data_set[index - 1].add(value) 

Лично я» d использование:

entry = entry.split() # split on whitespace 
for value, dset in zip(entry[1:], extracted_data[entry[0]]): 
    dset.add(value) 

для достижения того же.

+0

Должен ли я разделить строку, если она разделена на вкладку? – goldisfine

+0

'.split()' работает в * любом * пробеле, включая вкладки. –

+0

@goldisfine: Это не так, предыдущий ответчик не знал, какой формат вы использовали. Комментарий над ним читается * Предположим, что split() возвращает ... *. –

Смежные вопросы