KeyError в Python при удалении ключа из словаря, но ключ существует

Я пытаюсь удалить ключ из словаря, используя значение из другого ключа. Ключ существует, он говорит, что существует, когда я набираю value in dict.keys(), но я получаю сообщение об ошибке, когда пытаюсь его удалить.

def remove_duplicate_length(choices):
    print choices
    print choices['scheme']
    print type(choices['scheme'])
    print choices['scheme'] in choices.keys()
    print 'AABB' in choices.keys()
    scheme = choices['scheme']
    print type(scheme)
    del choices[scheme]

Печатает это:

{'ABAB': '2', 'AABB': '6', 'scheme': 'AABB', 'authors': ['Bukowski']}
AABB
<type 'str'>
True
True
<type 'str'>
None

И дает TypeError: 'NoneType' object has no attribute '__getitem__' при попытке сослаться на результат оператора return или keyerror: AABB при попытке напрямую распечатать результат.

Я печатаю результат следующим образом:

@route('/', method='POST')
def getUserChoice():
    user_selection = parse_data(request.body.read())
    print user_selection

person Cameron Sima    schedule 11.02.2016    source источник
comment
как вы пытаетесь распечатать результат?   -  person karthikr    schedule 11.02.2016
comment
None потому что del не дает вам возвращаемый тип. Если вы проверите choices, вы увидите, что этого ключа больше нет в словаре.   -  person karthikr    schedule 11.02.2016
comment
Вы пытаетесь сделать что-то вроде choices = remove_duplicate_length(choices)? Ваша функция не возвращает dict. Он изменяет его по ссылке.   -  person Łukasz Rogalski    schedule 11.02.2016
comment
О каком return утверждении вы говорите? Python не возвращает неявно результат последней команды, как некоторые другие языки, и даже если бы это было так, оператор del возвращает только None.   -  person Brendan Abel    schedule 11.02.2016
comment
Рогальский прав, у меня был оператор возврата внутри функции, который ничего не возвращает, только создает побочные эффекты.   -  person Cameron Sima    schedule 11.02.2016


Ответы (1)


Python dict имеет очень полезный метод get. Допустим, в вашем словаре может быть ключ или нет. Вы можете использовать get для получения его ключа или чего-то еще, затем вы можете проверить, удовлетворяет ли результат вашему условию.

>>> mydict = {'name': 'Jhon', 'age': 2}
>>> mydict.get('name')
Jhon
>>> mydict.get('lastname', 'Not found')
Not found

В вашем методе вы можете проверить, существует ли ключ, а затем удалить его.

...
scheme = choices.get('scheme', None)
print type(scheme)
if scheme:
    del choices[scheme]
person Mauro Baraldi    schedule 11.02.2016