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 对象,我们就可以访问它的特定键。

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...