KeyError: 0 при переборе ключей словаря в словаре
Я хочу удалить человека из каждой команды с наименьшим количеством очков. Но я всегда получал KeyError: 0
Players = {'An': {'Team ':'Red','Score':6 }, 'Jef': {'Team':'Blue','Score': 7 },'Jos': {'Team':'Red','Score':5 }}
names= Players.keys()
for i in range (len(names)):
if Players[i]["Team"] == Players[i+1]["Team"] :
if Players[i]['Score'] > PLayers[i+1]['Score']:
Players.remove(Players[i+1])
Кто-нибудь знает, какую ошибку я делаю? (Кстати, я знаю, что этот код неэффективен, как ад, но для этого проекта я не могу использовать большинство инструментов Python или, например, понимание списка)
6 ответов
Вы должны сделать что-то, как это:
Players = {'An': {'Team':'Red','Score':6 }, 'Jef': {'Team':'Blue','Score':7 },'Jos': {'Team':'Red','Score':5 }}
names = Players.keys()
player_to_remove = []
for i in range(0, len(names) - 1):
for j in range(i + 1, len(names)):
if Players[names[i]]['Team'] == Players[names[j]]['Team'] :
if Players[names[i]]['Score'] < Players[names[j]]['Score']:
player_to_remove.append(names[i])
if Players[names[i]]['Score'] > Players[names[j]]['Score']:
player_to_remove.append(names[j])
for key in player_to_remove:
del Players[key]
Печать наших игроков:
{'Jef': {'Score': 7, 'Team': 'Blue'}, 'An': {'Score': 6, 'Team': 'Red'}}
Джо был удален.
Ваша проблема в том, что вы зацикливаетесь на индекс, чего нет в словарях. Вам нужно выполнить цикл по ключам, а затем выполнить любую обработку, которую вы хотите сделать.
for pname, pinfo in Players.iteritems()
for i in range(len(names))
делает 0, 1, 2, 3, ...
Players
не имеет ни одного из этих ключей.
Не говоря уже о том, что вы пытаетесь создать какой-то порядок в словаре, который по определению является упорядоченной структурой данных. Вниз по этой дороге лежит безумие.
Вы пытаетесь проиндексировать диктат Players
как будто это был список. Использование:
for player in Players:
Также, пожалуйста, не используйте заглавные буквы Players
так как это делает его похожим на класс.
Вы не указали ключ в этом словаре.
Players = {'An': {'Team ':'Red','Score':6 }, 'Jef': {'Team':'Blue','Score': 7 },'Jos': {'Team':'Red','Score':5 }}
names= Players.keys()
for i in range (len(names)): # range will give you the integer, not the key in Players dict.
if Players[i]["Team"] == Players[i+1]["Team"] : # eg: for 1st loop you will get Players[0]["Team"] is not present in Players dict, will throw the key error.
if Players[i]['Score'] > PLayers[i+1]['Score']:
Players.remove(Players[i+1])
Во-первых for
цикл, индекс является целым числом. Затем вы пытаетесь получить доступ Players[i]
: невозможно, потому что ключи Players
только строки. В частности, вызов Players[0] приводит к ошибке: клавиша '0' не существует. KeyError происходит от этого.
Вместо этого вы должны использовать for key in Players.keys():