python之字典知识点总结(python中字典用法)
off999 2024-11-02 12:24 20 浏览 0 评论
字典的定义
字典(dict)是较常用的数据类型,使用键值对的方式存储数据。键(key)必须是不可变对象且不能重复,通常用字符串作key;值(value)则不限类型。字典的底层结构是散列表(hash table),可以快速查key得value,是一种以空间换时间的数据结构。
字典的优点是查找和添加数据的速度快,不会随着键的数量增加而变慢;缺点是耗费内存。
列表的缺点是查找和插入数据的速度随着元素数量增加而变慢;优点是节省内存。
另外需要注意的是python 3.6改写了字典的内部算法,因此在3.6及更高版本的python中字典是有序的,顺序是元素添加的顺序。python3.6以前的版本字典是无序的。以下是验证示例代码:
d= dict()
d["name"] = "Mike"
d["age"] = 20
d["money"] = 8000
d["height"] = 180
for key, value in d.items():
print(key, value)
#可多次运行上述代码验证,每次打印的顺序都和字典内容添加顺序一致,说明是有序的。
s= {"Mike",20,8000,180}
for i in s:
print(i)
#可多次运行上述代码验证,每次打印的顺序都不一样,说明是无序的。
字典的创建
- 空字典,一对花括号。
d={}
print(type(d))
out:
<class 'dict'>
- 一对键值对的字典,用冒号隔开键值对、花括号将其包围。
d = {'name':'Mike'}
print(type(t))
out:
<class 'dict'>
- 多对键值对的字典,用花括号将多对键值对包围,键值对之间用逗号隔开。
d = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(type(d))
out:
<class 'dict'>
- 其他类型转换成字典。
key = ('name', 'age', 'money', 'height')
value = ("Mike", 20, 8000, 180)
d = dict(zip(key, value)) # 将2个列表或元组合并成字典的最常用的方法,要熟记
print(d)
list1=[('a', 1), ('b', 2), ('c', 3)]
dict2 = dict(list1)
print(dict2) # 嵌套列表或元组,每个元素都是2个子元素,可转成字典,不如zip方法方便
out:
{'name': 'Mike', 'age': 20, 'money': 8000, 'height': 180}
{'a': 1, 'b': 2, 'c': 3}
- 字典推导式,字典推导式虽然有,实际用的很少,在此不再赘述。建字典最常用的dict(zip(key,value))方法要熟练掌握。
- 创建有键无值的字典或键不同值相同的字典。
key = ('name', 'age', 'money', 'height')
dict1 = dict.fromkeys(key) # 有键无值
print(dict1)
dict2 = dict.fromkeys(key, 0) # 键不同值相同
print(dict2)
out:
{'name': None, 'age': None, 'money': None, 'height': None}
{'name': 0, 'age': 0, 'money': 0, 'height': 0}
字典的访问
- 通过方括号访问键取值。若访问不存在的键会报错。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(dict1["money"])
# print(dict['country']) 异常TypeError: 'type' object is not subscriptable
out:
8000
- 用get方法访问键取值。可预设默认值,若键不存在,则返回默认值,不添加键值对;键存在则返回原值。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(dict1.get('name'))
print(dict1.get('country', 'USA'))
print(dict1) # get方法不会添加键值对
dict1['country'] = 'UK'
print(dict1.get('country', 'USA'))
out:
Mike
USA
{'name': 'Mike', 'age': 20, 'money': 8000, 'height': 180}
UK
- 用setdefault方法访问键取值。可预设默认值,若键不存在,则返回默认值,会添加键值对;键存在则返回原值。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(dict1.setdefault('name', 'George'))
print(dict1)
print(dict1.setdefault('country', 'USA'))
print(dict1)
out:
Mike
{'name': 'Mike', 'age': 20, 'money': 8000, 'height': 180}
USA
{'name': 'Mike', 'age': 20, 'money': 8000, 'height': 180, 'country': 'USA'}
字典的增加与修改
- 通过方括号直接添加或修改键值对。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
dict1['coutry'] = 'USA' # 字典无此键时表示添加键值对
dict1['age'] = 21 # 字典有此键时表示修改值
print(dict1)
out:
{'name': 'Mike', 'age': 21, 'money': 8000, 'height': 180, 'coutry': 'USA'}
- 通过update方法添加或修改键值对。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
dict1.update({'country': 'USA'}) # 字典无此键时表示添加键值对
dict1.update({'age': 21}) # 字典有此键时表示修改值
print(dict1)
out:
{'name': 'Mike', 'age': 21, 'money': 8000, 'height': 180, 'country': 'USA'}
字典的删除
- del:根据key删除元素,也可以直接删除字典本身。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
del dict1['money']
print(dict1)
del dict1
out:
{'name': 'Mike', 'age': 20, 'height': 180}
- pop方法:删除指定键,返回值;若指定的键不存在会报错。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(dict1.pop('money'))
print(dict1)
out:
8000
{'name': 'Mike', 'age': 20, 'height': 180}
- popitem方法:随机删除一项键值对并返回该键值对。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(dict1.popitem())
print(dict1)
out:
('height', 180)
{'name': 'Mike', 'age': 20, 'money': 8000}
- clear方法:清空字典内容,保留字典本身,在循环体中需要清空字典时优先用这个方法,而不要新建字典,因为新建的开销相对较大。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
dict1.clear()
print(dict1)
out:
{}
字典的查询
- 对字典的key做in运算。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print('name' in dict1)
print('Mike' in dict1)
out:
True
False
- 对字典的值做in运算。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print('name' in dict1.values())
print('Mike' in dict1.values())
out:
False
True
字典的内置方法
字典的内置方法非常丰富,除了上面说过的fromkeys、get、setdefault、update、pop、popitem、clear,还有一些序列通用方法len、copy,字典专属方法items()、keys()、values()。
- len,返回字典的元素长度。
- copy,建立字典的副本,内容一致,id不同。(注意:嵌套结构要用deepcopy)。
以下是案例:
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
print(len(dict1))
dict2 = dict1.copy()
print(id(dict1), id(dict2))
out:
4
2721528676224 2721528676288
- items,同时返回字典的键值对。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
for key, value in dict1.items():
print(key, value, end='\t')
out:
name Mike age 20 money 8000 height 180
- keys,返回字典的键。
dict1 = {"name": "Mike", "age": 20, "money": 8000, "height": 180}
for key in dict1.keys():
print(key, dict1[key], end='\t')
out:
name Mike age 20 money 8000 height 180
- values,返回字典的值。案例请查看前面的"字典的查询-对字典的值做in运算"
字典的嵌套结构
字典的键是不可变对象,不要用嵌套结构。字典的值是可变对象,可以是任意嵌套结构。
key = [i for i in range(5)]
value = [ (i, j) for i in range(1,5) for j in range(10,15)]
dict1 = dict(zip(key,value))
print(dict1)
out:
{0: (1, 10), 1: (1, 11), 2: (1, 12), 3: (1, 13), 4: (1, 14)}
相关推荐
- Linux 网络协议栈_linux网络协议栈
-
前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...
- 揭秘 BPF map 前生今世_bpfdm
-
1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...
- 教你简单 提取fmpeg 视频,音频,字幕 方法
-
ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...
- Linux内核原理到代码详解《内核视频教程》
-
Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...
- Linux C Socket UDP编程详解及实例分享
-
1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...
- libevent源码分析之bufferevent使用详解
-
libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...
- 一次解决Linux内核内存泄漏实战全过程
-
什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...
- 彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏
-
作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...
- linux网络编程常见API详解_linux网络编程视频教程
-
Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...
- Linux下C++访问web—使用libcurl库调用http接口发送解析json数据
-
一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...
- 平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道
-
在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...
- 谈谈分布式文件系统下的本地缓存_什么是分布式文件存储
-
在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...
- 进程间通信之信号量semaphore--linux内核剖析
-
什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...
- Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门
-
一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...
- 30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南
-
30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)