Вопрос по dictionary, python – Я получаю Ключевую ошибку в питоне

149

В моей программе Python я получаю эту ошибку:

<code>KeyError: 'variablename'
</code>

Из этого кода:

<code>path = meta_entry['path'].strip('/'),
</code>

Может кто-нибудь объяснить, почему это происходит?

Key error обычно означаетkey не существует. Итак, вы уверены, что «путь» существовать.? RanRag
Распечатать содержимоеmeta_entry и убедитесь, что ключ, который вы хотите, существует. Makoto

Ваш Ответ

6   ответов
108

е использоватьсловарь получить () метод, чтобы избежать исключений. Это также может быть использовано для указания пути по умолчанию, а неNone как показано ниже.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
+1 за очень актуальный комментарий .get (). Выглядит как хорошее приложение Python EAFP (проще просить прощения, чем разрешения) вместо LBYL (смотри, прежде чем прыгнуть), которое, я думаю, менее питонское.
2

dict с вложеннымиfor:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cat:
        print(cats[cat][attr])

Проследить:

Traceback (most recent call last):
      File "<input>", line 3, in <module>
    KeyError: 'K'

Потому что во втором цикле должно бытьcats[cat] вместо того, чтобы простоcat (что просто ключ)

Так:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cats[cat]:
        print(cats[cat][attr])

дает

black
10
white
8
4

В моей программе я использовал setdefault, чтобы отключить эту ошибку из соображений эффективности. в зависимости от того, насколько эффективна эта линия

>>>'a' in mydict.keys()  

Я новичок в Python тоже. На самом деле я только что узнал это сегодня. Так что прости меня за незнание эффективности.

В Python 3 вы также можете использовать эту функцию,

get(key[, default]) [function doc][1]

Говорят, что это никогда не вызовет ключевой ошибки.

Метод get древний, я думаю, что даже 1.x dicts имел его. Но я уверен, что у 2.7 уже было это.
3

что в вашем массиве отсутствует ключ, который вы ищете. Я обрабатываю это с помощью функции, которая либо возвращает значение, если оно существует, либо вместо этого возвращает значение по умолчанию.

def keyCheck(key, arr, default):
    if key in arr.keys():
        return arr[key]
    else:
        return default


myarray = {&apo,s;key1':1, 'key2':2}

print keyCheck('key1', myarray, '#default')
print keyCheck('key2', myarray, '#default')
print keyCheck('key3', myarray, '#default')

Выход:

1
2
#default
Да, я уже понял это некоторое время назад, но все равно спасибо. David Liaw
Аааа ... ужасный, ужасный пифонический код. Не пишите PHP-код на Python: это не массив, это словарь (вы можете назвать его хешем, но массив не уместен). И: у dicts уже есть ваш "keyCheck" функция: вместо «keyCheck (« key1 », myarray,« # default ») & quot; вы "сделаете" mydict.get ("key1", "# default") & quot;
24

if key in dict

и не использовать

if key in dict.keys()

Это займет много времени

Это самое элегантное решение.
210

KeyError обычно означает, что ключ не существует. Итак, вы уверены, чтоpath ключ существует?

Из официальных документов Python:

exception KeyError

Raised when a mapping (dictionary) key is not found in the set of existing keys.

Например:

>>> mydict = {'a':'1','b':'2'}
>>> mydict['a']
'1'
>>> mydict['c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'
>>>

Итак, попробуйте распечатать содержаниеmeta_entry и проверьте,path существует или нет.

>>> mydict = {'a':'1','b':'2'}
>>> print mydict
{'a': '1', 'b': '2'}

Или вы можете сделать:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
У меня есть доступ к моему коду, но ни один из кода, который он создает или использует движок David Liaw
хм ... как бы я это сделал? (Извините за то, что я новичок) Приложение размещено на движке приложений Google, и у меня нет доступа ни к каким файлам, которые оно создает. David Liaw
Итак, у вас нет доступа к коду Python, который использует приложение.
Это часть моего кода David Liaw
Итак, код, который вы разместилиpath = meta_entry['path'].strip('/'), это часть вашего кода или движка. Я боюсь, что если это часть двигателя, ничего не поделаешь.

Похожие вопросы