0

首先,我想指出我是一个python新手,我对编码完全没有经验,所以请耐心等待。我已经搜索了我的问题的答案,但没有成功。我有一堆文本行,其中包含这种格式的名称和团队:

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 年有多少球员有共同点?)。我怎样才能做到这一点?

任何帮助表示赞赏

4

3 回答 3

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))
于 2013-07-01T20:23:02.420 回答
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
于 2013-07-01T20:28:58.403 回答
0

对于这种情况,您应该熟悉 Map-Reduce,对其进行一些研究,这将对您有所帮助,我确定我在这里有一些代码,我正在尝试找到它,与此同时,这是一个好地方开始: http: //www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/

于 2013-07-01T19:56:32.140 回答