【问题标题】:Aggregate text keys-values python defaultdict [duplicate]聚合文本键值python defaultdict [重复]
【发布时间】:2013-07-02 04:28:58
【问题描述】:

首先,我想指出我是一个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 年有多少球员有共同点?)。我该怎么做?

感谢任何帮助

【问题讨论】:

  • 请不要一次又一次地发同样的问题。stackoverflow.com/questions/17411998/…和stackoverflow.com/questions/17405541/…。
  • 我已将其删除并进行了编辑。它怎么可能仍然存在?
  • 拥有 10k+ 代表的人可以查看已删除的问题,所以不要试图表现得聪明。
  • 好吧,对不起......我不是故意打扰,我不知道观看政策。
  • “聚合事物”是什么意思?看起来您拥有的字典正是您想要的?

标签: python text python-2.7


【解决方案1】:

首先,这一行:

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

【讨论】:

  • 谢谢,这正是我想做的……
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这个解决方案不是最佳的,但它可以按照您希望的方式工作:

    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-06-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2013-06-06
      • 2019-07-13
      • 2018-05-17
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多