【问题标题】:Can three iterations can be done in a single line? Python 3 for loop可以在一行中完成三个迭代吗? Python 3 for 循环
【发布时间】:2019-07-15 07:08:08
【问题描述】:

以下代码可以正常工作。但是不是调用 player_apps 三次可以在一个语句中完成吗?

for club in all_clubs:
    total_app = sum(player['season_apps'] for player in players_apps if player['player_club'] == club)
    total_sub_app = sum(player['season_sub_apps'] for player in players_apps if player['player_club'] == club)
    total_goals = sum(player['season_goals'] for player in players_apps if player['player_club'] == club)
    club_app_goal.append({'club' : club, 'total_app' : total_app, 'total_sub_app' : total_sub_app, 'total_goals' : total_goals})

【问题讨论】:

    标签: python-3.x list dictionary for-loop


    【解决方案1】:

    使用numpy

    for club in all_clubs:
        total_app = np.sum([[player['season_apps'], player['season_sub_apps'], player['season_goals']] for player in players_apps if player['player_club'] == club], axis=1)
        club_app_goal.append({'club' : club, 'total_app' : total_app[0], 'total_sub_app' : total_app[1], 'total_goals' : total_app[2]})
    
    

    【讨论】:

      【解决方案2】:

      好吧,从技术上讲,使用 functools.reduce 是可以的,但它不会使代码更漂亮,而且我不确定它是否真的会提高性能:

      total_app, total_sub_app, total_goals = reduce(
          lambda a, b: tuple(x + y for x, y in zip(a, b)), 
          ((p['season_apps'], p['season_sub_apps'], p['season_goals']) for p in players_apps if p["club"] == club), 
          (0, 0, 0)
          )
      

      恕我直言,一个更有趣的“优化”是每个俱乐部只过滤一次球员:

      for club in all_clubs:
          players = [player for player in players_apps if player['player_club'] == club]
          total_app = sum(player['season_apps'] for player in players)
          total_sub_app = sum(player['season_sub_apps'] for player in players)
          total_goals = sum(player['season_goals'] for player in players)
      

      它更具可读性,甚至可能实际上更快(或不更快,取决于您的数据)。

      话虽如此,您可能会受益于使用适当的关系数据库(关系数据库专为此类计算而设计)或至少 Numpy 或 Panda。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 2020-05-21
        相关资源
        最近更新 更多