2013-07-08 4 views
0

Я работаю с данными, в которых люди ввели свои имена и некоторые контактные данные. Однако, поскольку они не смогли ввести несколько записей для некоторых полей, некоторые люди ввели свои имена несколько раз, в результате чего были записаны «дубликаты» ...Флагирование записей с одинаковыми именами?

Я пытаюсь отметить дубликаты записей одним и тем же пользователем, используя переменный флаг.

Для каждой строки, что я хочу, так это то, что если запись в строке не совпадает с именем в следующей строке, запись флага должна увеличиться на единицу.

Как это сделать?

Это код, который я в настоящее время:

# FLAG 2 

import csv 

myjson = [] 

with(open("ieca_first_col_fake_text.txt", "rU")) as f: 
    sheet = csv.DictReader(f,delimiter="\t") 
    sheet.fieldnames.append('flag') 
    print sheet.fieldnames 
    for row in sheet: 
     myjson.append(row) 

flag_counter = 0 
myjson[0]['flag'] = flag_counter 

for i in range(len(myjson)-1): 
    if myjson[i]['name'] != myjson[i+1]['name']: 
     myjson[i+1]['flag'] = flag_counter + 1 
    else: 
     myjson[i]['flag'] = flag_counter 

for i in range(len(myjson)): 
    print myjson[i] 

Это пример данных:

name phone email website area degree 
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', 'flag'] 
{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''} 
{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': '[email protected]'} 
{'website': '', 'phone': '', 'flag': 1, 'name': 'Argle D. Bargle Ed.M.', 'email': ''} 
{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 0, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'} 
{'website': None, 'phone': '', 'flag': 0, 'name': 'Sam D. Man Ed.M.', 'email': None} 
{'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': None, 'name': 'Sam D. Man Ed.M.', 'email': ' [email protected]'} 
{'website': '', 'phone': '', 'flag': 1, 'name': 'D G Bamf M.S.', 'email': ''} 
{'website': '', 'phone': '', 'flag': 1, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''} 

Обратите внимание, что флаги не соответствуют требуемому шаблону.

А вот идеальный выход (обратите внимание на разницу в записях флага):

['name', 'phone', 'email', 'website', 'flag'] 
{'website': '', 'phone': '', 'flag': 0, 'name': 'Diane Grant Albrecht M.S.', 'email': ''} 
{'website': 'www.got.com', 'phone': '111-222-3333', 'flag': 1, 'name': 'Lannister G. Cersei M.A.T., CEP', 'email': '[email protected]'} 
{'website': '', 'phone': '', 'flag': 2, 'name': 'Argle D. Bargle Ed.M.', 'email': ''} 
{'website': 'www.daManWithThePlan.com', 'phone': '000-000-1111', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': '[email protected]'} 
{'website': None, 'phone': '', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': None} 
{'website': 'www.daManWithThePlan.com', 'phone': '111-222-333', 'flag': 3, 'name': 'Sam D. Man Ed.M.', 'email': ' [email protected]'} 
{'website': '', 'phone': '', 'flag': 4, 'name': 'D G Bamf M.S.', 'email': ''} 
{'website': '', 'phone': '', 'flag': 5, 'name': 'Amy Tramy Lamy Ph.D.', 'email': ''} 

ответ

0

EDIT: workes THS петля для меня (выходные, как и ожидалось):

for i in range(len(myjson)-1): 
    if myjson[i]['name'] != myjson[i+1]['name']: 
     print "not same" ,myjson[i]['name'] ,' ', myjson[i+1]['name'] 
     flag_counter = flag_counter + 1 
     myjson[i+1]['flag'] = flag_counter 
    else: 
     print 'equal', myjson[i]['name'] ,' ', myjson[i+1]['name'] 
     myjson[i]['flag'] = flag_counter 

Обратите внимание, что я пришлось отформатировать файл csv вручную (вкладки не были вкладками, а пробелами). Убедитесь, что в вашем файле правильно. Имена должны быть точными, никаких дополнительных пробелов не допускается

Но я не уверен, что это единственная ошибка, так как существует множество опасных ловушек «один за другим». Если он все еще не работает, просто обновите свой вывод и код, и мы увидим!

+0

Не думайте, что это все. – goldisfine

+0

Почему flag_counter всегда равен нулю, поэтому вы назначаете 0 + 1, если это новое имя, иначе 0. Но вы правы, это, скорее всего, не единственная ошибка ... – user27564