2013-07-01 2 views
0

Прежде всего, я хотел бы указать, что я новичок в python, и я совершенно неопытен в кодировании, поэтому, пожалуйста, будьте терпеливы. Я уже искал ответ на свою проблему, но без успеха. У меня есть куча строк в тексте с именами и команд в этом формате:Совокупные текстовые ключи-значения python defaultdict

Team (year)|Surname1, Name1 

например

Yankees (1993)|Abbot, Jim 
Yankees (1994)|Abbot, Jim 
Yankees (1993)|Assenmacher, Paul 
Yankees (2000)|Buddies, Mike 
Yankees (2000)|Canseco, Jose 

и т. Д. Несколько лет и несколько команд. Я хотел бы объединить имена игроков в соответствии с комбинацией (год), удаляя любые дублированные имена (может случиться, что в исходной базе данных имеется некоторая избыточная информация). В примере, мой вывод должен быть:

Yankees (1993)|Abbot, Jim, Assenmacher, Paul 
Yankees (1994)|Abbot, Jim 
Yankees (2000)|Buddies, Mike, Canseco, Jose 

Я написал этот код до сих пор:

file_in = open('filein.txt') 
file_out = open('fileout.txt', 'w+') 

from collections import defaultdict 
teams = defaultdict(set) 

for line in file_in: 
    items = [line.split('|')] 
    team = items[0] 
    name = items[1] 
    teams[team].add(name) 

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

Я также смог бы сравнить мои последние наборы значений (например, сколько игроков имеет команду Янки 1993 и 1994 годов?). Как я могу это сделать?

любая помощь

+3

Пожалуйста, не оставляйте тот же вопрос снова и again.http: // StackOverflow .com/questions/17411998/python-aggregate-keys-and-values-defaultdict и http://stackoverflow.com/questions/17405541/aggregate-sets-according-to-keys-with-defaultdict-python. –

+0

Я удалил его и отредактировал. Как это возможно, что все еще присутствует? – user2447387

+0

Люди с 10k + rep могут просматривать удаленный вопрос, поэтому не пытайтесь действовать умным. –

ответ

0

Во-первых, эта линия:

items = [line.split('|')] 

должно быть:

items = line.split('|') 

В противном случае, он создает список, состоящий из списка.


Во-вторых, я изменил это:

teams[team].add(name) 

к этому:

teams[team].add(name.strip()) 

В противном случае, вы получите дополнительные строки и пробелы в имени игрока.


Полный модифицированный код следующим образом:

for line in file_in: 
    items = line.split('|') 
    team = items[0] 
    name = items[1] 
    teams[team].add(name.strip()) 

Для печати словаря после:

>>> for team, players in teams.iteritems(): 
... print '{}|{}'.format(team, '|'.join(players)) 
... 
Yankees (1994)|Abbot, Jim 
Yankees (1993)|Assenmacher, Paul|Abbot, Jim 
Yankees (2000)|Canseco, Jose|Buddies, Mike 
+0

Спасибо, это именно то, что я хотел сделать ... – user2447387

0

В этом случае вы должны ознакомиться с Map-Reduce, исследуйте немного об этом, и это поможет вам, я уверен, что у меня есть некоторый код здесь, и я пытаюсь чтобы найти его, в то же время это хорошее место, чтобы начать: http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

0

это решение не является оптимальным, но это работает так, как вы хотите, чтобы:

for line in w.split('\n'): 
    items = line.split('|') 
    team = items[0] 
    names = items[1].split(',') 
    if team in teams: 
     teams[team].extend(names) 
    else: 
     teams[team] = names 

оттуда вы можете использовать:

for team, names in teams.iteritems(): 
    print team, len(set(names)) 
Смежные вопросы