python keyerror(0)

11年it研发经验,从一个会计转行为算法工程师,学过C#,c++,java,android,php,go,js,python,CNN神经网络,四千多篇博文,三千多篇原创,只为与你分享,共同成长,一起进步,关注我,给你分享更多干货知识!

本文讲得不是键盘的key,是python字典dict的key

当dict取值时,key在dict的key()中不存在,就会报错

 

python 在读取dictkeyvalue时,如果key不存在,就会触发KeyError错误,如:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
print(t['d'])

就会出现:


KeyError: 'd'

第一种解决方法

首先测试key是否存在,然后才进行下一步操作,如:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
if 'd' in t:
    print(t['d'])
else:
    print('not exist')

会出现:


not exist

第二种解决方法

利用dict内置的get(key[,default])方法,如果key存在,则返回其value,否则返回default;使用这个方法永远不会触发KeyError,如:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
print(t.get('d'))

会出现:


None

加上default参数:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
print(t.get('d', 'not exist'))
print(t)

会出现:


not exist
{'a': '1', 'c': '3', 'b': '2'}

第三种解决方法

利用dict内置的setdefault(key[,default])方法,如果key存在,则返回其value;否则插入此key,其valuedefault,并返回default;使用这个方法也永远不会触发KeyError,如:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
print(t.setdefault('d'))
print(t)

会出现:


None
{'b': '2', 'd': None, 'a': '1', 'c': '3'}

加上default参数:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
print(t.setdefault('d', 'not exist'))
print(t)

会出现:


not exist
{'c': '3', 'd': 'not exist', 'a': '1', 'b': '2'}

第四种解决方法

向类dict增加__missing__()方法,当key不存在时,会转向__missing__()方法处理,而不触发KeyError,如:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}


class Counter(dict):

    def __missing__(self, key):
        return None
c = Counter(t)
print(c['d'])

会出现:


None

更改return值:

Python

t = {
    'a': '1',
    'b': '2',
    'c': '3',
}


class Counter(dict):

    def __missing__(self, key):
        return key
c = Counter(t)
print(c['d'])
print(c)

会出现:


d
{'c': '3', 'a': '1', 'b': '2'}

第五种解决方法

利用collections.defaultdict([default_factory[,...]])对象,实际上这个是继承自dict,而且实际也是用到的__missing__()方法,其default_factory参数就是向__missing__()方法传递的,不过使用起来更加顺手:
如果default_factoryNone,则与dict无区别,会触发KeyError错误,如:

Python

import collections
t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
t = collections.defaultdict(None, t)
print(t['d'])

会出现:


KeyError: 'd'

但如果真的想返回None也不是没有办法:

Python

import collections
t = {
    'a': '1',
    'b': '2',
    'c': '3',
}

def handle():
    return None
t = collections.defaultdict(handle, t)
print(t['d'])

会出现:


None

如果default_factory参数是某种数据类型,则会返回其默认值,如:

Python

import collections
t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
t = collections.defaultdict(int, t)
print(t['d'])

会出现:


0

又如:

Python

import collections
t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
t = collections.defaultdict(list, t)
print(t['d'])

会出现:


[]

注意:
如果dict内又含有dictkey嵌套获取value时,如果中间某个key不存在,则上述方法均失效,一定会触发KeyError

Python

import collections
t = {
    'a': '1',
    'b': '2',
    'c': '3',
}
t = collections.defaultdict(dict, t)
print(t['d']['y'])

会出现:


KeyError: 'y'

 

### 解决 Python 中的 KeyError 错误 #### 使用 `get` 方法安全访问字典键值 为了防止程序因尝试访问不存在的键而崩溃,可以使用字典对象的 `get()` 方法。此方法允许指定默认返回值,在找不到给定键的情况下不会抛出异常而是返回设定好的默认值。 ```python t = {'a': '1', 'b': '2', 'c': '3'} value = t.get('d', None) # 如果'd'不在字典中,则返回None或其他自定义默认值 print(value) ``` 这种方法有效地避免了直接通过方括号语法访问可能不存在的键所带来的风险[^1]。 #### 利用条件判断检查键的存在性 另一种预防措施是在实际访问之前先验证目标键是否存在于字典内: ```python if 'd' in t: value = t['d'] else: value = "Default Value" print(value) ``` 这同样能够有效规避潜在的 `KeyError` 异常发生[^2]。 #### 应用 try-except 结构捕捉并处理异常 当无法提前预知哪些键可能会缺失时,可以通过包裹可能导致异常的操作于 `try...except` 块之中来进行优雅降级: ```python try: value = t['d'] # 尝试执行这段代码 except KeyError as e: print(f"Key {e} not found.") value = "Fallback Value" print(value) ``` 这种方式不仅可以让应用程序更加健壮,而且有助于定位具体哪个键引发了问题[^3]。 对于特定场景下由 Pandas 数据框引起的 `KeyError:0` 类型错误,确保数据文件正确加载以及设置合适的参数(比如 `header=None`)可以帮助解决问题;不过这个问题的具体解决方案取决于具体的上下文环境和使用的库版本等因素[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值