【问题标题】:Is there a way I can add points together for the same team in a list?有没有办法可以为列表中的同一支球队加分?
【发布时间】:2019-09-12 13:16:03
【问题描述】:

如何将一个团队的积分加起来?

这是我尝试过的:

def check_league(league_points):
    league_results = []
    for teams in league_points:
    team, points = teams.strip().rsplit(' ', 1)
    print(team, points)

这是我的清单:

['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']

输出:

('Lions', '1')

('Snakes', '1')

('Tarantulas', '3')

('FC Awesome', '0')

('Lions', '1')

('FC Awesome', '1')

('Tarantulas', '3')

('Snakes', '0')

('Lions', '3')
('Grouches', '0')

我希望输出是:

'Tarantulas', '6'

'Lions', '5'

'FC Awesome', '1'

'Snakes', '1'
'Grouches', '0'

【问题讨论】:

    标签: python arrays python-3.x list


    【解决方案1】:

    itertools.groupbysorted 一起使用:

    import itertools
    
    func = lambda x:x[0]
    sorted_l = sorted([i.rsplit(' ', 1) for i in l], key=func)
    {k: sum(map(int, list(zip(*g))[1])) for k, g in itertools.groupby(sorted_l, key=func)}
    

    输出:

    {'FC Awesome': 1, 'Grouches': 0, 'Lions': 5, 'Snakes': 1, 'Tarantulas': 6}
    

    【讨论】:

      【解决方案2】:

      您可以使用defaultdict 并遍历列表中项目的str.rsplit

      >>> from collections import defaultdict
      >>> d = defaultdict(int)
      >>> l = ['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']
      >>> for n, _, v in map(lambda s: s.rpartition(' '), l):
      ...     d[n] += int(v)
      ... 
      >>> d
      defaultdict(<class 'int'>, {'Lions': 5, 'Snakes': 1, 'Tarantulas': 6, 'FC Awesome': 1, 'Grouches': 0})
      

      此算法在O(n) 中运行,无需排序。

      【讨论】:

      • 请注意,使用 .rpartition(' ').rsplit(' ', 1) 的优化版本,所以我个人会这样做....(也更明确一些)
      • @JonClements,我总是忘记分区。感谢您的提示!
      • 很好地使用了defaultdict。比我自己的答案更喜欢它:)
      • 使用rpartition 会引发错误:for n, v in map(lambda s: s.rpartition(' '), l): ValueError: too many values to unpack (expected 2)
      • @DeveshKumarSingh 我忘记在拆包时更新_。现在是这样的
      【解决方案3】:

      我会将字符串拆分为团队和点,然后创建一个字典。

      li = ['Lions 1', 'Snakes 1', 'Tarantulas 3', 'FC Awesome 0', 'Lions 1', 'FC Awesome 1', 'Tarantulas 3', 'Snakes 0', 'Lions 3', 'Grouches 0']
      
      dct = {}
      for l in li:
          #Split only on last space
          name, count = l.rsplit(' ',1)
          if name in dct:
              dct[name] += int(count)
          else:
              dct[name] = int(count)
      
      print(dct)
      #{'Lions': 5, 'Snakes': 1, 'Tarantulas': 6, 'FC Awesome': 1, 'Grouches': 0}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2020-06-06
        • 2013-09-25
        • 1970-01-01
        • 2021-01-31
        • 2021-04-03
        • 1970-01-01
        相关资源
        最近更新 更多