【问题标题】:I'm getting Key error in python我在 python 中遇到关键错误
【发布时间】:2012-04-24 09:10:50
【问题描述】:

在我的 python 程序中,我收到了这个错误:

KeyError: 'variablename'

从此代码:

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

谁能解释一下为什么会这样?

【问题讨论】:

  • Key error 通常意味着key 不存在。那么,你确定“路径”存在吗?
  • 打印meta_entry的内容,确保你想要的key存在。
  • > 如果您不想出现异常,而是希望使用默认值,则可以使用 get() 方法_,例如path = meta_entry.get('path', None)。如果不能保证 path 存在,这很有用。 .请参阅@Adam 的 answer belowKeyError

标签: python dictionary


【解决方案1】:

KeyError 通常表示密钥不存在。那么,您确定path 密钥存在吗?

来自官方 python 文档:

KeyError 异常

当在集合中找不到映射(字典)键时引发 现有的密钥。

例如:

>>> 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

【讨论】:

  • 嗯...我该怎么做呢? (对不起,我是个菜鸟)该应用托管在谷歌应用引擎上,我无权访问它创建的任何文件。
  • 我可以访问我的代码,但没有它创建或引擎使用的代码
  • 所以,您发布的代码path = meta_entry['path'].strip('/'), 是您的代码或引擎的一部分。如果它是引擎的一部分,恐怕什么都做不了。
  • @lonehangman: 不仅仅是print meta_entry 并检查它是否包含path
  • Adam Lewis 解决方案简单高效
【解决方案2】:

我完全同意 Key error cmets。您也可以使用dictionary's get() 方法来避免异常。这也可以用于提供默认路径而不是None,如下所示。

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None

【讨论】:

  • +1 表示非常相关的 .get() 评论。看起来是 Python EAFP(比许可更容易请求宽恕)的一个很好的应用,而不是我认为不那么 Pythonic 的 LBYL(先看一下)。
【解决方案3】:

对于字典,只需使用

if key in dict

并且不要在键列表中使用搜索

if key in dict.keys()

后者会更耗时。

【讨论】:

    【解决方案4】:

    是的,这很可能是由不存在的密钥引起的。

    在我的程序中,出于效率考虑,我使用 setdefault 来消除此错误。 取决于这条线的效率如何

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

    我也是 Python 新手。其实我今天才学的。所以请原谅我对效率的无知。

    在 Python 3 中,你也可以使用这个函数,

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

    据说它永远不会引发关键错误。

    【讨论】:

    • get 方法很古老,我认为即使是 1.x 字典也有它。但我敢肯定 2.7 已经有了。
    【解决方案5】:

    这意味着您的数组缺少您要查找的密钥。我使用一个函数来处理这个问题,该函数要么返回值(如果存在),要么返回默认值。

    def keyCheck(key, arr, default):
        if key in arr.keys():
            return arr[key]
        else:
            return default
    
    
    myarray = {'key1':1, 'key2':2}
    
    print keyCheck('key1', myarray, '#default')
    print keyCheck('key2', myarray, '#default')
    print keyCheck('key3', myarray, '#default')
    

    输出:

    1
    2
    #default
    

    【讨论】:

    • 啊...可怕的,可怕的非 Python 代码。不要在 Python 中编写 PHP 代码:它不是一个数组,而是一个字典(你可以称它为哈希,但数组是正确的)。并且:dicts 已经有你的 "keyCheck" 功能:你可以用 "mydict.get('key1', '#default')" 代替 "keyCheck('key1', myarray, '#default')"
    【解决方案6】:

    我在使用嵌套的for 解析dict 时收到此错误:

    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
    

    【讨论】:

      【解决方案7】:

      如果您使用的是 Python 3,让我们让它变得简单

      mydict = {'a':'apple','b':'boy','c':'cat'}
      check = 'c' in mydict
      if check:
          print('c key is present')
      

      如果需要其他条件

      mydict = {'a':'apple','b':'boy','c':'cat'}
      if 'c' in mydict:
          print('key present')
      else:
          print('key not found')
      

      对于动态键值,也可以通过try-exception块来处理

      mydict = {'a':'apple','b':'boy','c':'cat'}
      try:
          print(mydict['c'])
      except KeyError:
          print('key value not found')mydict = {'a':'apple','b':'boy','c':'cat'}
      

      【讨论】:

        【解决方案8】:

        例如,如果这是一个数字:

        ouloulou={
            1:US,
            2:BR,
            3:FR
            }
        ouloulou[1]()
        

        它完美地工作,但是如果你使用例如:

        ouloulou[input("select 1 2 or 3"]()
        

        它不起作用,因为您的输入返回字符串“1”。所以你需要使用 int()

        ouloulou[int(input("select 1 2 or 3"))]()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-31
          • 2022-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-24
          • 1970-01-01
          相关资源
          最近更新 更多