0

この形式の名前とチームを含むテキストの行がたくさんあります。

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 = [entry.strip() for entry in line.split('|') if entry]    
    team = items[0]
    name = items[1]
    teams[team].add(name)

最終的に、キー (チーム名と年) と値のセットで構成される大きな辞書が作成されます。しかし、物事を集計する方法が正確にはわかりません。

また、最終的な値のセットを比較することもできます (たとえば、1993 年と 1994 年のヤンキーのチームに共通する選手は何人ですか?)。これどうやってするの?

どんな助けでも大歓迎です

4

1 に答える 1

0

ここでは、タプルをキーとして使用できます。('Yankees', '1994'):

from collections import defaultdict
dic = defaultdict(list)
with open('abc') as f:
    for line in f:
        key,val  = line.split('|')
        keys = tuple(x.strip('()') for x in key.split())
        vals = [x.strip() for x in val.split(', ')]
        dic[keys].append(vals)
print dic
for k,v in dic.iteritems():
    print "{}({})|{}".format(k[0],k[1],"|".join([", ".join(x) for x in v]))

出力:

defaultdict(<type 'list'>, 
{('Yankees', '1994'): [['Abbot', 'Jim']],
 ('Yankees', '2000'): [['Buddies', 'Mike'], ['Canseco', 'Jose']],
 ('Yankees', '1993'): [['Abbot', 'Jim'], ['Assenmacher', 'Paul']]})

Yankees(1994)|Abbot, Jim
Yankees(2000)|Buddies, Mike|Canseco, Jose
Yankees(1993)|Abbot, Jim|Assenmacher, Paul
于 2013-07-01T13:31:11.273 に答える