создать словарь из списка с функцией - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над набором данных премьер-лиги, и мне нужно создать словарь, в котором ключи - это команды, а значения - их относительные точки. У меня есть список команд и функция, которая берет результаты матчей и превращает их в очки для команд. У меня все получилось хорошо, но проблема в том, что вместо создания одного словаря со всеми командами и их результатами, он печатает по 20 словарей для каждой команды. Что не так?

enter image description here

Ответы [ 5 ]

4 голосов
/ 16 апреля 2020

Вы создаете новый словарь на каждой итерации. Вместо этого вы должны создать словарь до l oop и затем добавлять новую запись на каждой итерации:

def get_team_points(df, teams):
    team_points = {}
    for team_name in teams:
        num_points = ... # as you have it but since you posted an image I'm not rewriting it
        team_points[team_name] = num_points
    return team_points

Более точное решение - использовать словарное понимание

def get_team_points(df, teams):
    team_points = {team: get_num_points(team, df) for team in teams}
    return team_points

, где get_num_points - это функция вашей строки num_points = ..., которую я бы снова напечатал, если бы вы опубликовали код в виде текста:)

Также - пожалуйста, начните использовать лучшие имена переменных;) ваша жизнь улучшится, если вы делаете. Такие имена, как List и Dict, действительно плохие, поскольку:

  1. они не описательные
  2. они скрывают встроенные классы из модуля ввода (который вы должны использовать)
  3. они нарушают соглашения о присвоении имен pep8

и, говоря о модуле набора, вот оно в действии:

def get_team_points(df: pd.DataFrame, teams: List[str]) -> Dict[str, int]:
    team_points = {team: get_num_points(team, df) for team in teams}
    return team_points

теперь вы можете использовать такой инструмент, как mypy, чтобы ловить ошибки перед тем они происходят. Если вы используете IDE вместо Jupyter, он будет выделять ошибки, как вы go. Кроме того, ваш код станет намного понятнее для других разработчиков (включая вас в будущем) для понимания и использования.

3 голосов
/ 16 апреля 2020

Я думаю, возможно, вы хотите это:

def get_team_points(df, teams):
    Dict = {}
    for team_name in List:
        num_points = TeamPoints(...)
        Dict[team_name] = num_points
    print(Dict)
2 голосов
/ 16 апреля 2020

Вы хотите взять сумму HP для домашних команд и AP для команд на выезде и сложить их по командам. Вместо ручного разделения можно использовать две групповые операции и суммировать результаты.

Возвращение каждого groupby будет Серией, которую мы затем можем сложить, когда pandas выровняется по индексу (команды в этот случай). Затем с помощью Series.to_dict() мы получаем весь словарь одновременно.

import pandas as pd
df = pd.DataFrame({'HomeTeam': list('AABCDA'), 'AwayTeam': list('CBAAAB'),
                   'HP': [4,5,6,7,8,10], 'AP': [0,0,10,11,4,7]})

  HomeTeam AwayTeam  HP  AP
0        A        C   4   0
1        A        B   5   0
2        B        A   6  10
3        C        A   7  11
4        D        A   8   4
5        A        B  10   7

# Fill value so addition works if a team has exclusively home/away games.
s = df.groupby('HomeTeam')['HP'].sum().add(df.groupby('AwayTeam')['AP'].sum(),
                                           fill_value=0).astype(int)

s.to_dict()
{'A': 44, 'B': 13, 'C': 7, 'D': 8}
2 голосов
/ 16 апреля 2020

В методе TeamsPointDict () вы создаете словари для каждого члена команды в списке. Чтобы вставить все из них в один словарь, объявите словарь вне для l oop.

1 голос
/ 16 апреля 2020

Вы должны определить свой словарь перед функцией, затем добавить свои значения.

dic = {}
for team_name in List:
    dic[team_name] = num_points
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...