Слияние словаря с другим словарем

#python #dictionary

#python #словарь

Вопрос:

Прежде всего, извините за плохое форматирование или этикет, я новичок в python и stack overflow. Я видел другие несколько похожие вопросы на этот, но все остальные объединяют весь список. Мне нужны только части каждого словаря.

У меня есть список словарей, которые упорядочены по парам игр (команда 1, затем команда 2), мне нужно объединить пару каждого словаря в 1 (0 1, 2 3, и т.д.)

Вот пример моего полного списка словарей для справки

 games_detailed = 

[{'gameId': '8133',
  'teamId': '26',
  'fastBreakPoints': '16',
  'pointsInPaint': '40',
  'biggestLead': '15',
  'secondChancePoints': '16',
  'pointsOffTurnovers': '24',
  'longestRun': '9',
  'points': '116',
  'fgm': '42',
  'fga': '92',
  'fgp': '45.7',
  'ftm': '20',
  'fta': '29',
  'ftp': '69.0',
  'tpm': '12',
  'tpa': '42',
  'tpp': '28.6',
  'offReb': '10',
  'defReb': '39',
  'totReb': '49',
  'assists': '26',
  'pFouls': '28',
  'steals': '10',
  'turnovers': '15',
  'blocks': '8',
  'plusMinus': '4',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '0',
  'home': '0',
  'teamName': 'Orlando Magic'},
 {'gameId': '8133',
  'teamId': '1',
  'fastBreakPoints': '14',
  'pointsInPaint': '32',
  'biggestLead': '4',
  'secondChancePoints': '25',
  'pointsOffTurnovers': '22',
  'longestRun': '8',
  'points': '112',
  'fgm': '34',
  'fga': '92',
  'fgp': '37.0',
  'ftm': '34',
  'fta': '41',
  'ftp': '82.9',
  'tpm': '10',
  'tpa': '32',
  'tpp': '31.2',
  'offReb': '19',
  'defReb': '42',
  'totReb': '61',
  'assists': '20',
  'pFouls': '25',
  'steals': '8',
  'turnovers': '23',
  'blocks': '4',
  'plusMinus': '-4',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '1',
  'home': '1',
  'teamName': 'Atlanta Hawks'},
 {'gameId': '8134',
  'teamId': '24',
  'fastBreakPoints': '11',
  'pointsInPaint': '52',
  'biggestLead': '18',
  'secondChancePoints': '17',
  'pointsOffTurnovers': '19',
  'longestRun': '14',
  'points': '90',
  'fgm': '38',
  'fga': '83',
  'fgp': '45.8',
  'ftm': '9',
  'fta': '19',
  'ftp': '47.4',
  'tpm': '5',
  'tpa': '23',
  'tpp': '21.7',
  'offReb': '13',
  'defReb': '41',
  'totReb': '54',
  'assists': '23',
  'pFouls': '28',
  'steals': '12',
  'turnovers': '24',
  'blocks': '6',
  'plusMinus': '6',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '0',
  'home': '0',
  'teamName': 'New York Knicks'},
 {'gameId': '8134',
  'teamId': '10',
  'fastBreakPoints': '11',
  'pointsInPaint': '30',
  'biggestLead': '7',
  'secondChancePoints': '9',
  'pointsOffTurnovers': '24',
  'longestRun': '14',
  'points': '84',
  'fgm': '26',
  'fga': '80',
  'fgp': '32.5',
  'ftm': '22',
  'fta': '25',
  'ftp': '88.0',
  'tpm': '10',
  'tpa': '39',
  'tpp': '25.6',
  'offReb': '10',
  'defReb': '31',
  'totReb': '41',
  'assists': '17',
  'pFouls': '18',
  'steals': '12',
  'turnovers': '22',
  'blocks': '3',
  'plusMinus': '-6',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '1',
  'home': '1',
  'teamName': 'Detroit Pistons'},
 

Предполагаемый новый словарь =

 {'gameId' : '8133', 'away_team' : 'Orlando Magic', 'away_points' : '116',
 'home_team' : 'Atlanta Hawks', 'home_points' : '112', 'spread' : '-4',
 'home_win' : '0', 'home_loss' : 1}
 

Вот код, который я запустил, в котором я возвращаю ошибку индекса. Я думал создать словарь для каждой выездной игры, потому что они перечислены перед каждой парной домашней игрой. Затем, для домашней игры, я собирался .update(temp_dict) временный dict, который я создавал в каждом цикле, в мой основной список. Примечание (я бы приветствовал любую критику или замечания к моему коду. Все еще очень рано во всем этом. Спасибо!)

 game_list = []

i = 1

for game in games_detailed:
    if int(games_detailed[i-1]['home']) == 0:
        temp_dict = {}
        temp_dict['gameId'] = games_detailed[i-1]['gameId']
        temp_dict['away_team'] = games_detailed[i-1]['teamName']
        temp_dict['away_points'] = games_detailed[i-1]['points']
        game_list.append(temp_dict)    
    elif int(games_detailed[i-1]['home']) == 1:
        temp_dict = {}
        temp_dict['home_team'] = games_detailed[i-1]['teamName']
        temp_dict['home_points'] = games_detailed[i-1]['points']
        temp_dict['spread'] = games_detailed[i-1]['plusMinus']
        temp_dict['home_win'] = games_detailed[i-1]['homeWin']
        temp_dict['home_loss'] = games_detailed[i-1]['homeLoss']
        if i == 1:
            count = i-1
        else:
            count = int(i/2)
        game_list[count].update(temp_dict)
    i  = 1
 

Комментарии:

1. если вам нужно работать с парами, возможно, попробуйте использовать zip() — ie. for team1, team2 in zip(games_detailed[0::2], games_detailed[1::2]):

Ответ №1:

Если вы хотите работать с парами 0 1 , 2 3 , и т.д., То вы можете использовать zip() с [0::2] и [1::2]

 game_list = []

for team1, team2 in zip(games_detailed[0::2], games_detailed[1::2]):
    # get values from both teams and create one dictionary

    game = {}

    # team1 - away
    game['gameId'] = team1['gameId']
    game['away_team'] = team1['teamName']
    game['away_points'] = team1['points']
    # etc.

    # team2 - home
    game['home_team'] = team2['teamName']
    game['home_points'] = team2['points']
    game['spread'] = team2['plusMinus']
    game['home_win'] = team2['homeWin']
    # etc.

    game_list.append(game)
 

В конце концов вам придется проверять team1['home'] team2['home'] и изменять порядок

  if team1['home'] == 1:
     team1, team2 = team2, team1
 

Редактировать:

Полный рабочий код с примерами данных

 games_detailed = [
{'gameId': '8133',
  'teamId': '26',
  'fastBreakPoints': '16',
  'pointsInPaint': '40',
  'biggestLead': '15',
  'secondChancePoints': '16',
  'pointsOffTurnovers': '24',
  'longestRun': '9',
  'points': '116',
  'fgm': '42',
  'fga': '92',
  'fgp': '45.7',
  'ftm': '20',
  'fta': '29',
  'ftp': '69.0',
  'tpm': '12',
  'tpa': '42',
  'tpp': '28.6',
  'offReb': '10',
  'defReb': '39',
  'totReb': '49',
  'assists': '26',
  'pFouls': '28',
  'steals': '10',
  'turnovers': '15',
  'blocks': '8',
  'plusMinus': '4',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '0',
  'home': '0',
  'teamName': 'Orlando Magic'},
 {'gameId': '8133',
  'teamId': '1',
  'fastBreakPoints': '14',
  'pointsInPaint': '32',
  'biggestLead': '4',
  'secondChancePoints': '25',
  'pointsOffTurnovers': '22',
  'longestRun': '8',
  'points': '112',
  'fgm': '34',
  'fga': '92',
  'fgp': '37.0',
  'ftm': '34',
  'fta': '41',
  'ftp': '82.9',
  'tpm': '10',
  'tpa': '32',
  'tpp': '31.2',
  'offReb': '19',
  'defReb': '42',
  'totReb': '61',
  'assists': '20',
  'pFouls': '25',
  'steals': '8',
  'turnovers': '23',
  'blocks': '4',
  'plusMinus': '-4',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '1',
  'home': '1',
  'teamName': 'Atlanta Hawks'},
 {'gameId': '8134',
  'teamId': '24',
  'fastBreakPoints': '11',
  'pointsInPaint': '52',
  'biggestLead': '18',
  'secondChancePoints': '17',
  'pointsOffTurnovers': '19',
  'longestRun': '14',
  'points': '90',
  'fgm': '38',
  'fga': '83',
  'fgp': '45.8',
  'ftm': '9',
  'fta': '19',
  'ftp': '47.4',
  'tpm': '5',
  'tpa': '23',
  'tpp': '21.7',
  'offReb': '13',
  'defReb': '41',
  'totReb': '54',
  'assists': '23',
  'pFouls': '28',
  'steals': '12',
  'turnovers': '24',
  'blocks': '6',
  'plusMinus': '6',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '0',
  'home': '0',
  'teamName': 'New York Knicks'},
 {'gameId': '8134',
  'teamId': '10',
  'fastBreakPoints': '11',
  'pointsInPaint': '30',
  'biggestLead': '7',
  'secondChancePoints': '9',
  'pointsOffTurnovers': '24',
  'longestRun': '14',
  'points': '84',
  'fgm': '26',
  'fga': '80',
  'fgp': '32.5',
  'ftm': '22',
  'fta': '25',
  'ftp': '88.0',
  'tpm': '10',
  'tpa': '39',
  'tpp': '25.6',
  'offReb': '10',
  'defReb': '31',
  'totReb': '41',
  'assists': '17',
  'pFouls': '18',
  'steals': '12',
  'turnovers': '22',
  'blocks': '3',
  'plusMinus': '-6',
  'min': '240:00',
  'homeWin': '0',
  'homeLoss': '1',
  'home': '1',
  'teamName': 'Detroit Pistons'},
]

game_list = []

for team1, team2 in zip(games_detailed[0::2], games_detailed[1::2]):
    # get values from both teams and create one dictionary

    if team1['home'] == 1:
        team1, team2 = team2, team1

    game = {}

    # team1 - away
    game['gameId'] = team1['gameId']
    game['away_team'] = team1['teamName']
    game['away_points'] = team1['points']
    # etc.

    # team2 - home
    game['home_team'] = team2['teamName']
    game['home_points'] = team2['points']
    game['spread'] = team2['plusMinus']
    game['home_win'] = team2['homeWin']
    # etc.

    game_list.append(game)

for game in game_list:
    print(game)
 

Результат:

 {'gameId': '8133', 'away_team': 'Orlando Magic', 'away_points': '116', 'home_team': 'Atlanta Hawks', 'home_points': '112', 'spread': '-4', 'home_win': '0'}
{'gameId': '8134', 'away_team': 'New York Knicks', 'away_points': '90', 'home_team': 'Detroit Pistons', 'home_points': '84', 'spread': '-6', 'home_win': '0'}
 

Ответ №2:

Вы могли бы использовать defaultdict(dict) для группировки по игре и создавать вложенные словари для home away команд или, а затем обновлять его в dict по умолчанию на основе gameId

 from collections import defaultdict

#Name mappings
away_keys = list(zip(['gameId','away_team','away_points'], #New key names
                     ['gameId','teamName','points']))       #Old key names

home_keys = list(zip(['gameId','home_team','home_points','spread','home_win'],
                     ['gameId','teamName','points','plusMinus','homeWin']))


games = defaultdict(dict)
for g in games_detailed:
    if g['home']=='0':
        d = {i:g[j] for i,j in away_keys}
    else:
        d = {i:g[j] for i,j in home_keys}
    games[d['gameId']].update(d)

game_results = list(games.values())
game_results
 
 [{'gameId': '8133',
  'away_team': 'Orlando Magic',
  'away_points': '116',
  'home_team': 'Atlanta Hawks',
  'home_points': '112',
  'spread': '-4',
  'home_win': '0'},
 {'gameId': '8134',
  'away_team': 'New York Knicks',
  'away_points': '90',
  'home_team': 'Detroit Pistons',
  'home_points': '84',
  'spread': '-6',
  'home_win': '0'}]