#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'}]