Можно ли выполнить три итерации в одной строке?Python 3 для цикла - PullRequest
0 голосов
/ 21 февраля 2019

Следующий код работает нормально.Но вместо того, чтобы вызывать 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})

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

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

0 голосов
/ 21 февраля 2019

Использование 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]})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...