Сохранение каждой итерации понимания словаря в новом вложенном словаре - PullRequest
1 голос
/ 28 мая 2020

Приносим извинения за избыточность, пытался выполнить эту работу в течение 3 дней.

Я не могу понять, как сохранить новый словарь внутри моего вложенного словаря.

for team, roster in team_roster.items():  
 stats['rp'][team] = {}
 for player in roster:
    if player in rp_year_STD[1]:
        stats['rp'][team] = {stat_type: stat for stat_type in p_stat_type for stat_list in rp_year_STD\
for stat in stat_list if stat_list[0] == stat_type}

Пробовал это делает то же самое (1 повторяющийся словарь для каждой команды):

for team, roster in team_roster.items():  
 stats['rp'][team] = {}
 for player in roster:
     if player in rp_year_STD[1]:
         for stat_type in p_stat_type:
             for stat_list in rp_year_STD:
                  if stat_list[0] == stat_type:
                     for stat in stat_list:
                       stats['rp'][team][stat_type] = stat

Команда - это строковый ключ в отдельном словаре (team_roster, показанный ниже) roster - это список строк / имен игроков для каждой команды. Игрок является строкой в ​​списке строк (ростере). rp_year_STD - это список списков. rp_year_STD 1 - это список строк / имен игроков. p_stat_type - это список строк, который проверяет ключи в результирующем словаре (rp_year_STD - это список списков, составленных из электронной таблицы, заголовок каждого столбца потенциально является ключом в результирующем словаре).

Я понимаю, что Я создаю 1 словарь с этим пониманием словаря.

Я хочу создать новый словарь для каждого игрока, включенного в список и rp_year_STD, и сохранить его в соответствующем командном словаре, но я просто создаю 1 идентичный словарь игрока (который, конечно, состоит из пар ключ / значение из последней записи в rp_year_STD или строки в электронной таблице, из которой взяты данные) для каждого командного словаря.

Извините, если это не имеет смысла , искренне признателен за всю информацию, размещенную здесь. Спасибо.

Вот что такое rp_year_STD, каждый столбец представляет собой список в списке, а rp_year_STD 1 представляет собой список строк / имен игроков.

Here's what rp_year_STD is, each column being a list with a list and [1] being the name of each player which may or may not be included in player list

Вот список ключей, которые я сравниваю с индексом заголовка столбца / [0] каждого списка. Я не хочу, чтобы каждый столбец / элемент / значение списка находился в результирующем словаре, поэтому я проверяю его с помощью списка p_stat_type (показано ниже):

p_stat_type = ['Name', 'TBF', 'H', '2B', '3B', 'R', 'ER', 'HR', 'BB', 'IBB', 'HBP', 'SO', 'AVG', 'OBP', 'SLG', 'wOBA', 'playerId',  'K/BB', 'HR/9',\
           'K%', 'BB%', 'K-BB%', 'AVG', 'WHIP', 'BABIP', 'LOB%', 'FIP', 'xFIP', 'playerId' 'GB/FB', 'LD%', 'GB%', 'FB%', 'IFFB%', 'HR/FB', 'IFH%', 'BUH%', \
               'Pull%', 'Cent%', 'Oppo%', 'Soft%', 'Med%', 'Hard%', 'playerId']

Вот дублирующийся словарь, который помещается в каждый ключ [team]:

'CHC': {'Name': 'Emmanuel Clase', 'TBF': '89', 'H': '19', '2B': '5', '3B': '1', 'R': '8', 'ER': '6', 'HR': '2', 'BB': '4', 'IBB': '0', 'HBP': '1', 'SO': '21', 'AVG': '0.226190476', 'OBP': '0.269662921', 'SLG': '0.38095238', 'wOBA': '0.2757020506', 'playerId': '21032'}

Очень близко к работе, но это только последнее значение для каждого списка в rp_year_STD.

Вот словарь team_roster, функция team_roster возвращает список строк \ текущие игроки для каждой команды:

team_roster = {'ARI' : team_roster(ARI, 'Diamondbacks'),
'BAL' : team_roster(BAL, 'Orioles'),
'BOS' : team_roster(BOS, 'Red Sox'),
'CHC' : team_roster(CHC, 'Cubs'),
'CIN' : team_roster(CIN, 'Reds'),
'CLE' : team_roster(CLE, 'Indians'),
'COL' : team_roster(COL, 'Rockies'),
'DET' : team_roster(DET, 'Tigers'),
'HOU' : team_roster(HOU, 'Astros'),
'KC' : team_roster(KC, 'Royals'),
'LAD' : team_roster(LAD, 'Dodgers'),
'WSH' : team_roster(WSH, 'Nationals'),
'NYM' : team_roster(NYM, 'Mets'),
'OAK' : team_roster(OAK, 'Athletics'),
'PIT' : team_roster(PIT, 'Pirates'),
'SD' : team_roster(SD, 'Padres'),
'SEA' : team_roster(SEA, 'Mariners'),
'SF' : team_roster(SF, 'Giants'),
'STL' : team_roster(STL, 'Cardinals'),
'TB' : team_roster(TB, 'Rays'),
'TEX' : team_roster(TEX, 'Rangers'),
'TOR' : team_roster(TOR, 'Blue Jays'),
'MIN' : team_roster(MIN, 'Twins'),
'PHI' : team_roster(PHI, 'Phillies'),
'ATL' : team_roster(ATL, 'Braves'),
'CWS' : team_roster(CWS, 'White Sox'),
'MIA' : team_roster(MIA, 'Marlins'),
'NYY' : team_roster(NYY, 'Yankees'),
'MIL' : team_roster(MIL, 'Brewers')} 

team_roster (teamA, 'TeamA') будет ['A. Man ',' A-Jax ']

Еще раз спасибо всем за любые предложения.

1 Ответ

1 голос
/ 02 июня 2020

В конце концов я решил проблему, 1. используя плеер в качестве ключа, как предложил @furas - спасибо за ваше время! 2. Ссылка на индекс игрока в понимании словаря и удаление вложенного l oop из понимания и добавление как обычно l oop, как, опять же, @furas. Итак, надеюсь, это будет полезно, и / или я получу некоторые обоснованные предложения по улучшению. Спасибо, ниже приведен код, который у меня получился:

  for team in team_roster.keys(): 
  stats['hitter'][team] = {}
  for player in sort_roster(team)[0]:
      if player in h_zips[0]:         
          h_zips_index = h_zips[0].index(player)
          index = h_year_STD[1].index(player)
          if h_zips[1][h_zips_index] == team and h_zips[25][h_zips_index] == h_year_STD[23][index]:
              stats['hitter'][team][player] = {}
              for stat_list in h_year_STD:
                  player_dict = {stat_type: stat_list[index] for stat_type in h_stat_type if stat_list[0] == stat_type}
                  stats['hitter'][team][player].update(player_dict)
...