Python 中 KeyError: 0 exception 错误

news2024/11/27 15:56:11

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))  # 👉️ None

print(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))  # 👉️ None

print(my_dict.get(0, 0))  # 👉️ 0

print(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 runs
    print('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 defaultdict

my_dict = defaultdict(list)

my_dict[0].append('a')
my_dict[0].append('b')

print(my_dict)  # 👉️ defaultdict(<class 'list'>, {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 defaultdict

employee = defaultdict(dict)

employee['address']['country'] = 'China'

# 👇️ defaultdict(<class 'dict'>, {'address': {'country': 'China'}})
print(employee)

print(employee['address'])  # 👉️ {'country': 'China'}

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

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

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

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

from collections import defaultdict

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KDZD互感器二次负载测试仪

一、概述 电能计量综合误差过大是电能计量中普遍存在的一个关键问题。电压互感器二次回路压降引起的计量误差往往是影响电能计量综合误差的因素。所谓电压互感器二次压降引起的误差&#xff0c;就是指电压互感器二次端子和负载端子之间电压的幅值差相对于二次实际电压的百分数…

五分钟了解JumpServer V2.* 与 v3 的区别

一、升级注意项 1、梳理数据。JumpServer V3 去除了系统用户功能&#xff0c;将资产与资产直接绑定。当一个资产名下有多个同名账号&#xff0c;例如两个root用户时&#xff0c;升级后会自动合并最后一个root&#xff0c;不会同步其他root用户。升级前需保证每一个资产只拥有一…

即时通讯系列-N-客户端如何在推拉结合的模式下保证消息的可靠性展示

结论先行 原则&#xff1a; server拉取的消息一定是连续的原则&#xff1a; 端侧记录的消息的连续段有两个作用&#xff1a; 1. 记录消息的连续性&#xff0c; 即起始中间没有断层&#xff0c; 2. 消息连续&#xff0c; 同时意味着消息是最新的&#xff0c;消息不是过期的。同…

Java学习-MySQL-创建数据库表

Java学习-MySQL-创建数据库表 SHOW DATABASESUSE school CREATE TABLE IF NOT EXISTS student( id INT(10) NOT NULL AUTO_INCREMENT COMMENT 学号, name VARCHAR(30) NOT NULL DEFAULT 匿名 COMMENT 姓名, pws VARCHAR(20) NOT NULL DEFAULT 123456 COMMENT 密码, sex VARCHA…

算法题--二叉树(判断是不是平衡二叉树、二叉树的中序遍历、二叉树最大深度、对称二叉树、合并二叉树)

目录 二叉树 题目 判断是不是平衡二叉树 题链接 解析 核心思想 答案 二叉树的中序遍历 原题链接 解析 核心思想 答案 二叉树最大深度、对称二叉树、合并二叉树 二叉树 该类题目的解决一般是通过节点的遍历去实现&#xff0c;一般是分两种。 一是递归&#xff08;…

【记录】日常|shandianchengzi的三周年创作纪念日

机缘 接触 CSDN 之前&#xff0c;我已经倒腾过 hexo 搭建 github 博客、本地博客、图床&#xff1b;   接触 CSDN 之后&#xff0c;我还倒腾过纸质笔记、gitee 博客、博客园、知乎、b站、Notion、腾讯文档、有道云笔记、XMind、飞书文档、简书等一系列创作平台&#xff0c;但…

SAPUI5开发01_01-Installing Eclipse

1.0 简要要求概述: 本节您将安装SAPUI 5,以及如何在Eclipse Juno中集成SAPUI 5工具。 1.1 安装JDK JDK 是一种用于构建在 Java 平台上发布的应用程序、Applet 和组件的开发环境,即编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。 在安装 JDK 之前,首…

1635_fileno的简单使用

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 在看MIT的OS课程的时候发现自己动不动就因为只是的缺少而卡住&#xff0c;而这个学习占据了我工作之余很多的时间。现在都有一点觉得通关不了的感觉了&#xff0c;…

1. Qt Designer Studio界面介绍

1. 说明&#xff1a; Qt当中的Qt Quick框架使用QML语言来快速搭建优美的界面&#xff0c;但是对于单纯做界面的设计人员并不是很友好&#xff0c;还要让界面设计人员去消耗时间成本学习QML语法。Qt Designer Studio软件就是为了解决这个问题而设计的&#xff0c;工作人员不需要…

【Blender】Stability AI插件 - AI生成图像和动画

Stability AI 的官方插件允许 Blender 艺术家使用现有的项目和文本描述来创建新的图像、纹理和动画。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 1、安装Stability for Blender插件 首先&#xff0c;从这里下载最新版本的 Blender&#xff0c;然后转到 Addon Relea…

论文阅读笔记|大规模多标签文本分类

多标签文本分类&#xff08;Extreme Multi Label Classification, MLTC&#xff09;是自然语言处理领域中一个十分重要的任务&#xff0c;其旨在从一个给定的标签集合中选取出与文本相关的若干个标签。MLTC可以广泛应用于网页标注&#xff0c;话题识别和情感分析等场景。大规模…

1636_isatty函数的功能

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面刚刚看完了一个函数和三个文件指针&#xff0c;一行代码懂了半行。但是继续分析我之前看到的代码还是遇到了困难&#xff0c;因为之前自己对于UNIX的一些基础知…

网络协议(十四):WebSocket、WebService、RESTful、IPv6、网络爬虫、HTTP缓存

网络协议系列文章 网络协议(一)&#xff1a;基本概念、计算机之间的连接方式 网络协议(二)&#xff1a;MAC地址、IP地址、子网掩码、子网和超网 网络协议(三)&#xff1a;路由器原理及数据包传输过程 网络协议(四)&#xff1a;网络分类、ISP、上网方式、公网私网、NAT 网络…

Kubernetes(K8s)接入Prometheus示例、查看指标

Prometheus安装关联服务见&#xff1a;https://blog.csdn.net/lsc_2019/article/details/129445580?spm1001.2014.3001.5502 在Kubernetes中创建一个Deployment和一个Service apiVersion: apps/v1 kind: Deployment metadata:name: myapp spec:replicas: 3selector:matchLabe…

Jackson 返回前端的 Response结果字段大小问题

目录 1、问题产生的背景 2、出现的现象 3、解决方案 4、成果展现 5、总结 6、参考文章 1、问题产生的背景 因为本人最近工作相关的对接外部项目&#xff0c;在我们国内有很多程序员都是使用汉语拼音或者部分字母加上英文复合体定义返回实体VO&#xff0c;这样为了能够符合…

数据表(三) - 多语言的实现

前文介绍了关于数据表的几种形式&#xff0c;以及如何让数据表运用更加简单高效&#xff0c;这篇我们来讲讲多语言在数据表中的实现方式。游戏项目中文字显示本身就是件比较头疼的事&#xff0c;再加上多语言&#xff0c;更多的问题将待需解决。很多时候项目起初&#xff0c;文…

Golang-GMP模型

写在前面 Go 为了自身 goroutine 执行和调度的效率&#xff0c;自身在 runtime 中实现了一套 goroutine 的调度器&#xff0c;下面通过一段简单的代码展示一下 Go 应用程序在运行时的 goroutine&#xff0c;方便大家更好的理解。 The Go scheduler is part of the Go runtime,…

华为机试题:HJ92 在字符串中找出连续最长的数字串(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

C++语法规则2(C++面向对象)

继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#xff0c;也达到了重用代码功能和提高执行效率的效果。 当创建一个类时&#xff0c;您不需要重新编写新的数据成员和成…

SpringBoot修改启动图标(详细步骤)

目录 一、介绍 二、操作步骤 三、介绍Java学习&#xff08;题外话&#xff09; 四、关于基础知识 一、介绍 修改图标就是在资源加载目录&#xff08;resources&#xff09;下放一个banner.txt文件。这样运行加载的时候就会扫描到这个文件&#xff0c;然后启动的时候就会显…