【问题标题】:Aggregate sets according to keys with defaultdict python使用 defaultdict python 根据键聚合集合
【发布时间】:2013-06-28 15:17:47
【问题描述】:

我有一堆文本格式的名称和团队:

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 年有多少球员有共同点?)。我该怎么做?

感谢任何帮助

【问题讨论】:

    标签: python text dictionary defaultdict


    【解决方案1】:

    您可以在此处使用元组作为键,例如。 ('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
    

    【讨论】:

    • 实际上我希望能够将姓名和年份视为不可分割的项目,并将每行仅分成两部分(带有'|')。问题是数据库可能还包含括号中的其他字符串,我想我可以通过使用 () 作为分隔符来搞砸事情
    • @user2447387 如果您不确定 () 将包含什么,那么您将如何比较两个键?请发布一个包含此类字符串的更好示例。
    • 不幸的是,原始数据非常混乱。我试图清理它,我会说在 95% 的情况下,线条的结构总是相同的(如示例中所示)。但是,可能会有一些例外,一旦大多数行将被聚合,我将处理它们。这就是为什么我认为从我的角度来看只处理 2 个子字符串(由 '|' 分隔)更安全
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 2019-04-24
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多