2014-10-29 3 views
0

У меня есть текстовый файл с двумя именами столбцов | фамилия, в которой имя может иметь различное семейство, поэтому у нас есть несколько строк с тем же именем и разными именами. Файл составляет около 50 ГБ. То, что я хочу, это количество фамилий на имя.Самый быстрый способ подсчета количества уникальных значений на ключ?

В настоящее время я создал словарь с именами в качестве ключей и фамилии в качестве значений, и я распечатываю каждый ключ и длину значения (как набор фамилий). Но это не очень эффективно и быстро

d = defaultdict(set) 


f = open(file, 'r') 
for n, line in enumerate(f): 
    name,family= line.split('|') 
    d[name].add(family) 


for name, family in d.iteritems(): 
    print("%s|%s" % (name, len(family)), file = w) 

ли любое тело любое предложение для более быстрого способа получения такого же результата?

+0

50gb текста? Сколько строк у этого файла? Просто любопытно. –

+0

@Apero Я не знаю – UserYmY

+0

В вашей оболочке: wc -l

ответ

0

Один из вариантов заключается в использовании collections.Counter. Это приведет к удвоению одинаковых строк, но может пойти быстрее:

import collections 

with open('input.txt', 'r') as f: 
    d = collections.Counter(line.split('|',1)[0] for line in f) 

print d.most_common(5) 
+0

Это не работает. Я получаю эту ошибку: AttributeError: объект 'module' не имеет атрибута 'counter' – UserYmY

+0

1) Используете ли вы Python версии 2.7 или выше? 'collections.Counter' был представлен в 2.7. 2) Правильно ли вы написали «Счетчик»? Он начинается с капитала 'C', и ваше сообщение об ошибке имеет строчную букву' c'. –

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