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():

Другие вопросы по тегам