Python 中 KeyError: 0 exception 错误
创始人
2024-06-01 02:42:12
0

Python “KeyError: 0” 异常是在我们尝试访问不包含0 这个键的时候去访问该键而引起的。

要解决该错误,请在尝试访问字典之前在字典中设置键,或者如果键不存在,则使用 dict.get() 获取默认值。

下面是一个产生上述错误的示例

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}# ⛔️ KeyError: 0
print(my_dict[0])

Python 中 KeyError 0 exception

我们尝试访问不包含 0 键的字典中的 0 键。

使用 dict.get() 方法

避免“KeyError: 0”异常的一种方法是使用 dict.get() 方法。

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}print(my_dict.get(0))  # 👉️ Noneprint(my_dict.get(0, 'default value'))  # 👉️ default value

如果键在字典中,则 dict.get 方法返回给定键的值,否则返回默认值。

该方法采用以下 2 个参数:

  • key 要为其返回值的键
  • default 如果字典中不存在提供的键,则返回默认值(可选)

如果未提供默认参数的值,则默认为 None,因此 get() 方法永远不会引发 KeyError。

我们可以使用适合我们的用例的任何默认值,例如 无、0 或空字符串。

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}print(my_dict.get(0, None))  # 👉️ Noneprint(my_dict.get(0, 0))  # 👉️ 0print(my_dict.get(0, ''))  # 👉️ ""

在访问之前为键设置一个值

解决错误的另一种方法是在尝试访问特定键之前为它设置一个值。

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}my_dict[0] = [] # 👈️ 将键初始化为空列表my_dict[0].append('a')
my_dict[0].append('b')print(my_dict[0])  # 👉️ ['a', 'b']

我们在示例中将 0 键初始化为一个空列表。

现在我们可以安全地访问密钥而不会出现 KeyError 异常。

在设置之前检查密钥是否不存在

我们还可以在设置之前检查字典中是否不存在该键。

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}# ✅ 如果 key 不存在则初始化 key
if 0 not in my_dict:my_dict[0] = []my_dict[0].append('a')
my_dict[0].append('b')print(my_dict[0])  # 👉️ ['a', 'b']

我们检查字典中是否不存在 0 键并将其值初始化为空列表。

使用 try/except 语句来处理错误

我们还可以使用 try/except 语句来处理错误。

my_dict = {1: ['c', 'd'], 2: ['e', 'f']}try:print(my_dict[0])
except KeyError:# 👇️ this runsprint('key does not exist in dict')my_dict[0] = []  # 👈️ 必要时可以初始化 key

尝试访问字典中的 0 键会导致 KeyError 异常,然后传递给 except 块。

KeyError 异常由 except 子句处理,您可以在必要时初始化 0 键。

使用 dict.items() 方法遍历字典

如果需要遍历字典,请使用 dict.items() 方法。

my_dict = {0: ['a', 'b'], 1: ['c', 'd'], 2: ['e', 'f']}for key, value in my_dict.items():print(key, value)  # 0 ['a', 'b'], 1 ['c', 'd'], 2 ['e', 'f']

dict.items 方法返回字典项((键,值)对)的新视图。

我们还可以在遍历字典时使用 range() 类。

my_dict = {1: ['b'], 3: ['c'], 5: ['d']}for index in range(0, 10):if index in my_dict:# ['b']# ['c']# ['d']print(my_dict[index])

for 循环使用范围类来获取从 0 到 9 的迭代器。

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(0, 10)))

在每次迭代中,我们在访问索引之前检查索引是否存在于字典中。

使用 defaultdict 类解决错误

我们还可以使用 defaultdict 类来避免该错误。

from collections import defaultdictmy_dict = defaultdict(list)my_dict[0].append('a')
my_dict[0].append('b')print(my_dict)  # 👉️ defaultdict(, {0: ['a', 'b']})

请注意 ,我们必须在使用前导入 defaultdict 类。

defaultdict 类采用 default_factory 参数,它调用该参数为给定键提供默认值。

键的值被插入到字典中并被返回。

我们将列表类传递给构造函数,因此每次我们尝试访问不存在的键时,都会在不带任何参数的情况下调用列表类,并为该键设置一个列表对象。


在 Python 中分配新 Key 时出现 KeyError 异常

尝试分配嵌套键时在字典中分配新键时会引发 KeyError 异常。

要解决该错误,请有条件地设置键或使用 defaultdict 类为字典中不存在的键设置默认值。

下面是错误如何发生的示例。

employee = {'name': 'Jiyik'
}# ⛔️ KeyError: 'address'
employee['address']['country'] = 'China'

我们试图在字典中分配一个嵌套键,但是地址键不存在,所以我们得到一个 KeyError 异常。

首先为键赋值

解决错误的一种方法是先为地址键分配一个值。

employee = {'name': 'Jiyik'
}employee['address'] = {} # 👈️ 将键分配给空字典employee['address']['country'] = 'China'# 👇️ {'name': 'Jiyik', 'address': {'country': 'China'}}
print(employee)

我们将 address 键设置为空字典,因此我们能够分配嵌套的 country 键。

但是,如果它已经在字典中设置,这将覆盖 address 键。


在赋值之前检查键是否存在

如果字典中不存在键,则只能分配键。

employee = {'name': 'Jiyik'
}if 'address' not in employee:employee['address'] = {}employee['address']['country'] = 'China'# 👇️ {'name': 'Jiyik', 'address': {'country': 'China'}}
print(employee)

if 语句仅在地址键不在字典中时运行。

使用 defaultdict 类为不存在的键设置默认值

我们还可以使用 defaultdict 类为字典中尚不存在的键设置默认值。

from collections import defaultdictemployee = defaultdict(dict)employee['address']['country'] = 'China'# 👇️ defaultdict(, {'address': {'country': 'China'}})
print(employee)print(employee['address'])  # 👉️ {'country': 'China'}

defaultdict 类采用 default_factory 参数,它调用该参数为给定键提供默认值。

键的值被插入到字典中,并被返回。

我们将 dict 类传递给构造函数,因此每次我们尝试访问不存在的键时,都会在不带任何参数的情况下调用 dict 类,并为该键设置一个 dict 对象。

这是 defaultdict 对象如何工作的简单示例。

from collections import defaultdictmy_dict = defaultdict(int)print(my_dict['a'])  # 👉️ 0

字典中不存在 a 键,因此 int() 类在没有任何参数的情况下被调用,并且为我们尝试访问的键设置了 0 值。

设置密钥时使用 try/except 语句

我们还可以在向字典添加新键时使用 try/except 语句来处理 KeyError 异常。

employee = {'name': 'Jiyik'
}try:employee['address']['country'] = 'China'
except KeyError:employee['address'] = {}employee['address']['country'] = 'China'# 👇️ {'name': 'Jiyik', 'address': {'country': 'China'}}
print(employee)

KeyError 异常由我们分配地址键并为嵌套国家键设置值的 except 子句处理。

(JSON) Python 中的 KeyError 异常

解决 Python 中的 (JSON) KeyError 异常,使用 json.loads() 方法将 JSON 字符串解析为原生 Python 对象,并在访问它之前有条件地检查字典中是否存在键。

import jsonmy_json = r'{"name": "Jiyik", "age": 30}'# 👇️ 将 JSON 字符串解析为 Python 字典
my_dict = json.loads(my_json)
print(my_dict)  # 👉️ {'name': 'Jiyik', 'age': 30}# 👇️ 检查字典中是否存在键
if 'country' in my_dict:print(my_dict['country'])

json.loads 方法将 JSON 字符串解析为本机 Python 对象。

我们使用 in 运算符在访问字典之前检查字典中是否存在国家/地区键。

与字典一起使用时,运算符会检查字典对象中是否存在指定键。


如果密钥不存在,则将其设置为默认值

或者,我们可以检查键是否不在字典中并将其设置为默认值,例如 空字符串或空列表。

import jsonmy_json = r'{"name": "Jiyik", "age": 30}'my_dict = json.loads(my_json)
print(my_dict)  # 👉️ {'name': 'Jiyik', 'age': 30}if 'country' not in my_dict:my_dict['country'] = ''print(my_dict['country'])  # 👉️ ''

如果字典中不存在 country 键,我们只会将其设置为空字符串。

调试时,使用 dict.keys() 方法打印字典的键。

import jsonmy_json = r'{"name": "Jiyik", "age": 30}'my_dict = json.loads(my_json)
print(my_dict)  # 👉️ {'name': 'Jiyik', 'age': 30}# 👇️ ['name', 'age']
print(list(my_dict.keys()))

如果我们尝试访问任何其他键,将得到 KeyError 异常。


忽略 KeyError 异常

如果我们只需要访问特定的键,并且需要忽略 KeyError 异常,请使用 dict.get() 方法。

import jsonmy_json = r'{"name": "Jiyik", "age": 30}'my_dict = json.loads(my_json)
print(my_dict)  # 👉️ {'name': 'Jiyik', 'age': 30}print(my_dict.get('country'))  # 👉️ None
print(my_dict.get('country', 'default value'))  # 👉️ 'default value'

如果键在字典中,则 dict.get 方法返回给定键的值,否则返回默认值。

该方法采用以下 2 个参数:

  • key 要为其返回值的键
  • default 如果字典中不存在提供的键,则返回默认值(可选)

如果未提供默认参数的值,则默认为 None,因此 get() 方法永远不会引发 KeyError


确保正确访问 key

确保我们没有尝试错误地访问key。

import jsonmy_json = r'{"address": {"country": "China"}}'my_dict = json.loads(my_json)
print(my_dict)  # 👉️ {'address': {'country': 'China'}}print(my_dict['address']['country'])  # 👉️ 'China'

请注意 ,在访问嵌套的 country 键之前,我们首先必须访问 address 键。

如果有数组,请确保在尝试访问键之前在特定索引处访问它。

import jsonmy_json = r'[{"address": {"country": "China"}}]'my_list = json.loads(my_json)
print(my_list)  # 👉️ [{'address': {'country': 'China'}}]print(my_list[0]['address']['country'])  # 👉️ 'China'

我们将 JSON 字符串解析为一个列表。 请注意,我们首先必须访问索引 0 处的列表以获取字典对象。

一旦我们有了一个 dict 对象,我们就可以访问它的特定键。

相关内容

热门资讯

曾经的爱 曾经的爱我自己来回答我可能是真的喜欢她但是,每次不知道为什么看到她就一中伤心的感觉不知道谁能告诉我这...
小公鸡不见偷偷的跟在小鸭子后面... 小公鸡不见偷偷的跟在小鸭子后面也下了水偷偷地这个词加上这个词的好处是小公鸡不见偷偷的跟在小鸭子后面也...
开紫钻一年多少钱? 开紫钻一年多少钱?我卖180 ,一年大概120 玩旋舞特适合用财富通开8.8折一共是211
关于韩剧 关于韩剧灰姑娘的姐姐吧,不错。还有一枝梅。狗与狼的时间,都好看。
谁小泰罗的电影? 谁小泰罗的电影?小泰罗奥特曼的电影? 你说的这个是奥特曼剧场版《奥特物语》网上搜一下就能找到
电纸书和mp4功能一样吗,买电... 电纸书和mp4功能一样吗,买电子书好还是mp4好啊?推荐一款吧?谢谢看你具体干什么了,如果喜欢看电子...
关于ff14的装备出售问题! ... 关于ff14的装备出售问题! 为什么好多装备无法在市场出售?紫装绿装不说,为什么普通白装也不能关于f...
为什么佛法的争论那么激烈? 为什么佛法的争论那么激烈?因为他们没有一个统一的经典,来指导他们,告诉他们真理. 不然他们就不会拜那...
为什么有的调皮美女不喜欢调皮男... 为什么有的调皮美女不喜欢调皮男人,不稳重没有安全感。她喜欢成熟有男人味安全感男人?大部分女人都喜欢成...
哪些男明星男人味儿彰显,成熟的... 哪些男明星男人味儿彰显,成熟的魅力撩动心弦让你沦陷?朱一龙,张若昀,李钟硕,李承铉,靳东等,这些男明...
天书奇谈里皇城里的盘龙石柱在哪... 天书奇谈里皇城里的盘龙石柱在哪阿、?点左上角的【寻】会出来一个框,里面有蟠龙石柱,点击左键会自动寻找...
50年前,长沙镖子岭。老烟头把... 50年前,长沙镖子岭。老烟头把他的旱烟在地上敲了敲:“下不下去喃?”独眼的小伙子说:“不去,电视剧5...
如何评价演员袁姗姗,她是不是真... 如何评价演员袁姗姗,她是不是真的不适合娱乐圈?因人而异吧,我个人还是比较喜欢她的,虽然长得确实不漂亮...
各路大神? 各路大神?既然可以发送、接受文件,可以确认电脑蓝牙驱动正常,可以连接手机蓝牙。接下来要确认手机有蓝牙...
三国演义诸葛亮的资料 三国演义诸葛亮的资料三国演义诸葛亮的资料去看史书就知道了诸葛亮子孔明,号卧龙,南阳人,著作出师表,隆...
如何隐藏一个硬盘分区,只能我自... 如何隐藏一个硬盘分区,只能我自己能进,别人都看不到。用patition magic 隐藏分区
韩剧名字其中两个字是爱情 韩剧名字其中两个字是爱情没关系,是爱情啊--赵寅成,孔孝真最佳爱情--车胜元,孔孝真爱情能用钱买吗-...
谁炒股一年能挣百万 谁炒股一年能挣百万规定时间 数量 你以为在算加减法 能有正解答案 股市是有时长时短 时多时少 这是没...
一个你不爱的人 一个你不爱的人面拒绝 呵呵,女的都出来了,这问题到是比较符合你们!其他的怎么女的回答的那么少??
有人有曲的成语 有人有曲的成语曲尽人情【读音】qū jìn rén qíng【释义】委婉周到地把人之常情或世态充分体...