聚合文本键 - 值python defaultdict

时间:2013-07-01 19:36:29

标签: python text python-2.7

首先,我想指出我是一名蟒蛇新手,我对编码完全缺乏经验,所以请耐心等待。我已经找到了问题的答案,但没有成功。 我在文本中有很多行,其中包含这种格式的名称和团队:

Team (year)|Surname1, Name1

e.g。

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年的Yankee团队?)。我怎么能这样做?

感谢任何帮助

3 个答案:

答案 0 :(得分:0)

对于这种情况你应该熟悉Map-Reduce,稍微研究一下它会对你有所帮助,我确信我在这里有一些代码并且我试图找到它,同时这是一个好的开始: http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

答案 1 :(得分: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))

答案 2 :(得分: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