首先,我想指出我是一名蟒蛇新手,我对编码完全缺乏经验,所以请耐心等待。我已经找到了问题的答案,但没有成功。 我在文本中有很多行,其中包含这种格式的名称和团队:
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团队?)。我怎么能这样做?
感谢任何帮助
答案 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