Ну, технически да, используя 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.