1、字典的应用场景

思考1: 如果有多个数据,例如:'Tom', '男', 20,如何快速存储?

答:列表

  1. list1 = ['Tom', '男', 20]

思考2:如何查找到数据'Tom'?

答:查找到下标为0的数据即可。

  1. list1[0]

思考3:如果将来数据顺序发生变化,如下所示,还能用list1[0]访问到数据'Tom'吗?。

  1. list1 = ['男', 20, 'Tom']

答:不能,数据'Tom'此时下标为2。

思考4:数据顺序发生变化,每个数据的下标也会随之变化,如何保证数据顺序变化前后能使用同一的标准查找数据呢?

答:字典,字典里面的数据是以键值对形式出现,字典数据和数据顺序没有关系,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找数据即可。

2、字典的概念

  • 字典属于一种新的数据结构,称为映射(mapping)。

    字典不再是序列,无法通过为止索引完成元素值的获取,只能通过键索引实现。

    字典也是Python中唯一内建的映射类型。
  • 字典的作用和列表类似,都是用来存储对象的容器。
  • 列表存储数据的性能很好,但是查询数据的不是很方便(要么知道下标,要么就要一个一个遍历)。
  • 在字典中每一个元素都有一个唯一的名字,通过这个唯一的名字可以快速的查找到指定的元素。
  • 在查询元素时,字典的效率是非常快的。
  • 在字典中可以保存多个对象,每个对象都会有一个唯一的名字。
    • 这个唯一的名字,我们称其为键(key),

      通过key可以快速的查询value

      字典的键可以是任意的不可变对象(intstrbooltuple ...),但是一般我们都会使用str

      字典的键是不能重复的,如果出现重复的后边的会替换到前边的。
    • 这个对象,我们称其为值(value),字典的值可以是任意对象。
    • 所以字典,我们也称为叫做键值对(key-value)结构。
    • 每个字典中都可以有多个键值对,而每一个键值对我们称其为一项(item)。

3、创建字典的语法

字典特点

  • 符号为大括号。
  • 数据为键值对形式出现。
  • 各个键值对之间用逗号隔开。
  1. # 1.创建有数据字典
  2. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  3. print(type(dict1)) # <class 'dict'>
  4. # 2.创建空字典
  5. # 方式1
  6. dict2 = {}
  7. print(type(dict2)) # <class 'dict'>
  8. # 方式2,通过dict()函数
  9. dict3 = dict()
  10. print(type(dict3)) # <class 'dict'>
  11. # 3.使用dict()函数来创建有元素的字典
  12. # 每一个参数都是一个键值对,参数名就是键,参数名就是值
  13. # (这种方式创建的字典,key都是字符串)
  14. d = dict(name='孙悟空', age=18, gender='男')
  15. print(d) # {'name': '孙悟空', 'age': 18, 'gender': '男'}
  16. print(type(d)) # <class 'dict'>

注意:一般称冒号前面的为键(key),简称k;冒号后面的为值(value),简称v

4、字典常见操作

(1)字典的增加操作

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值;如果key不存在则新增此键值对。

  1. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  2. # 1.修改字典中name的值。
  3. dict1['name'] = 'Rose'
  4. # 结果:{'name': 'Rose', 'age': 20, 'gender': '男'}
  5. print(dict1)
  6. # 2.新增id属性
  7. dict1['id'] = 110
  8. # {'name': 'Rose', 'age': 20, 'gender': '男', 'id': 110}
  9. print(dict1)

注意:字典为可变类型。

(2)字典的删除操作

@1、del()方法 或 del函数

del()方法 或 del函数:删除字典或删除字典中指定键值对。

  1. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  2. # 1.删除字典中指定的键值对
  3. # 结果:{'name': 'Tom', 'age': 20}
  4. del dict1['gender']
  5. print(dict1)
  6. # 2.通过del删除整个字典
  7. # 结果:NameError: name 'dict1' is not defined
  8. del(dict1)
  9. print(dict1)
  10. # 3.所删除的key不包含在字典中,会抛异常
  11. # 结果:KeyError: 'genders'
  12. del dict1['genders']
  13. print(dict1)

@2、clear()方法

clear()方法:清空字典

  1. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  2. dict1.clear()
  3. print(dict1) # {}

@3、popitem()方法

popitem()方法随机删除字典中的一个键/值对,一般都会删除最后一个键值对。

删除之后,它会将删除的key-value作为返回值返回,

返回的是一个元组,元组中有两个元素,第一个元素是删除的key,第二个是删除的value

  1. """
  2. 1.在字典中删除一个键值对。
  3. 输出结果:
  4. result = ('c', 3)
  5. {'a': 1, 'b': 2}
  6. """
  7. d = {'a': 1, 'b': 2, 'c': 3}
  8. result = d.popitem()
  9. print("result = ", result)
  10. print(d)
  11. # 2.当使用popitem()删除一个空字典时,会抛出异常。
  12. # 结果:KeyError: 'popitem(): dictionary is empty'
  13. d = {}
  14. d.popitem()

@4、pop(key[, default])方法

  1. """
  2. 1.pop(key[, default])方法,
  3. 根据key删除字典中的key-value,
  4. 会将被删除的value返回!
  5. 输出结果:
  6. result = 1
  7. {'b': 2, 'c': 3}
  8. """
  9. d = {'a': 1, 'b': 2, 'c': 3}
  10. result = d.pop('a')
  11. print("result = ", result)
  12. print(d)
  13. """
  14. 2.如果删除的key,在字典中不存在,会抛出异常。
  15. """
  16. # 结果:KeyError: 'f'
  17. d = {'a': 1, 'b': 2, 'c': 3}
  18. result = d.pop('f') # 异常
  19. """
  20. 3.如果指定了默认值,再删除不存在的key时,不会报错,
  21. 而是直接返回默认值。
  22. 输出结果:
  23. result = 这是默认值
  24. {'a': 1, 'b': 2, 'c': 3}
  25. """
  26. d = {'a': 1, 'b': 2, 'c': 3}
  27. result = d.pop('z','这是默认值')
  28. print("result = ", result)
  29. print(d)

(3)字典的修改

@1、通过key修改字典

写法:字典序列[key] = 值

注意:如果key存在则修改这个key对应的值 ,如果key不存在则新增此键值对。

  1. dict1 = {'name': 'TOM', 'age': 20, 'gender': '男'}
  2. # 修改
  3. # 结果:{'name': 'Lily', 'age': 20, 'gender': '男'}
  4. dict1['name'] = 'Lily'
  5. print(dict1)
  6. # 增加
  7. # 结果:{'name': 'Lily', 'age': 20, 'gender': '男', 'id': 110}
  8. dict1['id'] = 110
  9. print(dict1)

@2、setdefault(key[, default])方法

  1. """
  2. setdefault(key[, default]) 可以用来向字典中添加key-value,
  3. 如果key已经存在于字典中,则返回key的值,不会对字典做任何操作,
  4. 如果key不存在,则向字典中添加这个key,并设置value,返回默认值。
  5. """
  6. # 1.存在key,不会对字典做任何操作,返回key的值
  7. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  8. result = dict1.setdefault('name','猪八戒')
  9. print('result =',result) # result = Tom
  10. print(dict1) # {'name': 'Tom', 'age': 20, 'gender': '男'}
  11. # 2.不存在key,添加值,返回key的默认值
  12. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  13. result = dict1.setdefault('id','猪八戒')
  14. print('result =',result) # result = 猪八戒
  15. print(dict1) # {'name': 'Tom', 'age': 20, 'gender': '男', 'id': '猪八戒'}

@3、update([other])方法

  1. """
  2. 将其他的字典中的key-value添加到当前字典中
  3. 如果有重复的key,则后边的会替换到当前的
  4. """
  5. # 结果:{'a': 7, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
  6. d = {'a': 1, 'b': 2, 'c': 3}
  7. d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
  8. d.update(d2)
  9. print(d)

(4)字典的查找

@1、key值查找

key必须加引号,否则按变量识别。

  1. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  2. # 1.key存在返回对应的值
  3. print(dict1['name']) # Tom
  4. # 2.字典中没有对应的key
  5. # 结果KeyError: 'id'
  6. print(dict1['id']) # 报错

如果当前查找的key存在,则返回对应的值;否则则报错。

@2、get()方法

该方法用来根据键来获取字典中的值。

语法:

  1. 字典序列.get(key, 默认值)

注意:如果当前查找的key不存在则返回第二个参数(默认值),如果省略第二个参数,则返回None。

快速体验:

  1. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  2. # 1.如果key存在,返回对应的值
  3. print(dict1.get('name')) # Tom
  4. # 2.如果key不存在,返回默认值。
  5. print(dict1.get('id', 110)) # 110
  6. # 3.如果key不存在,也没有设置默认值,则返回None。
  7. print(dict1.get('id')) # None

@3、keys()方法

示例:

  1. # 查找字典中所有的key,返回一个序列,包含字典中所有的key。
  2. # 是一个可迭代的序列。(就是支持for遍历)
  3. # 结果:dict_keys(['name', 'age', 'gender'])
  4. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  5. print(dict1.keys())

遍历字典的key:

  1. """
  2. # dict1.keys()得到可遍历的对象
  3. 输出结果:
  4. name
  5. age
  6. gender
  7. """
  8. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  9. for key in dict1.keys():
  10. print(key)

@4、values()方法

示例:

  1. # 查找字典中所有的value值,返回一个序列,包含字典中所有的value值。
  2. # 是一个可迭代的序列。
  3. # 结果:dict_values(['Tom', 20, '男'])
  4. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  5. print(dict1.values())

遍历字典的value:

  1. """
  2. # dict1.values()得到可遍历的对象
  3. 输出结果:
  4. Tom
  5. 20

  6. """
  7. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  8. for value in dict1.values():
  9. print(value)

@5、items()方法

示例:

  1. # 查找字典中所有的键值对,返回一个序列,包含字典中所有的键值对(项)。
  2. # 是一个可迭代的序列。
  3. # 可迭代对象里面的数据是元组(有的也叫双值子序列),
  4. # 元组中数据1是字典的key,元组中数据2是字典key对应的值。
  5. # 结果:dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
  6. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  7. print(dict1.items())

遍历字典的元素:

  1. """
  2. # dict1.items()得到可遍历的对象,其中的元素是一个元组。
  3. 输出结果:
  4. ('name', 'Tom')
  5. ('age', 20)
  6. ('gender', '男')
  7. """
  8. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  9. for item in dict1.items():
  10. print(item)

遍历字典的键值对:

也就是将得到的数据进行一个拆包动作。

  1. """
  2. xx.items(): 返回可迭代对象,内部的元素是元组,
  3. 而元组有2个数据,将元组中的第一个数据赋值给第一个变量,第二个数据赋值给第二个变量。
  4. 也就是元组数据1是字典的key,元组数据2是字典的value,
  5. 这就是所谓的拆包动作。(可以看元祖中将的序列的拆包)
  6. 输出结果:
  7. name = Tom
  8. age = 20
  9. gender = 男
  10. """
  11. dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
  12. for key, value in dict1.items():
  13. print(f'{key} = {value}')

(5)copy()复制

和列表中的用法一样,这里补充说明:

copy()方法用于对字典进行浅复制,复制以后的对象,和原对象是独立,修改一个不会影响另一个。

但注意,浅复制会简单复制对象内部的值,如果内部值也是一个可变对象,这个可变对象不会被复制。

  1. #基本用法和列表一样。(可以看列表)
  2. """
  3. # 字典的value可以存储的还是字典,
  4. 这个value值的字典用copy()方法的时候,是不进行复制的,
  5. 在内存中还是一份的,所以修改其中一个字典的value,
  6. 另一个也会改变。
  7. 输出结果:
  8. d = {'a': {'name': '猪八戒', 'age': 18}, 'b': 2, 'c': 3}
  9. d2 = {'a': {'name': '猪八戒', 'age': 18}, 'b': 2, 'c': 3}
  10. """
  11. d = {'a': {'name': '孙悟空', 'age': 18}, 'b': 2, 'c': 3}
  12. d2 = d.copy()
  13. d2['a']['name'] = '猪八戒'
  14. print("d = ", d)
  15. print("d2 = ", d2)

『无为则无心』Python序列 — 21、Python字典及其常用操作的更多相关文章

  1. 『无为则无心』Python序列 — 17、Python字符串操作常用API

    目录 1.字符串的查找 @1.find()方法 @2.index()方法 @3.rfind()和rindex()方法 @4.count()方法 2.字符串的修改 @1.replace()方法 @2.s ...

  2. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

  3. 『无为则无心』Python序列 — 23、Python序列的公共API

    目录 1.运算符 @1.+加号 @2.*乘号 @3.in或not in 2.公共方法 @1.len()方法 @2.del和del() @3.max()方法 @4.min()方法 @5.range() ...

  4. 『无为则无心』Python序列 — 24、Python序列的推导式

    目录 1.列表推导式 (1)快速体验 (2)带if的列表推导式 (3)多个for循环实现列表推导式 2.字典推导式 (1)创建一个字典 (2)将两个列表合并为一个字典 (3)提取字典中目标数据 3.集 ...

  5. 『无为则无心』Python基础 — 62、Python中自定义迭代器

    目录 1.迭代器对象的创建 2.实际应用案例 3.总结: 1.迭代器对象的创建 迭代器是一种可以被遍历的对象,并且能够作用于next()函数,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问 ...

  6. 『无为则无心』Python基础 — 12、Python运算符详细介绍

    目录 1.表达式介绍 2.运算符 (1)运算符的分类 (2)算数运算符 (3)赋值运算符 (4)复合赋值运算符 (5)比较运算符 3.逻辑运算符 拓展1:数字之间的逻辑运算 拓展2:Python中逻辑 ...

  7. 『无为则无心』Python基础 — 4、Python代码常用调试工具

    目录 1.Python的交互模式 2.IDLE工具使用说明 3.Sublime3工具的安装与配置 (1)Sublime3的安装 (2)Sublime3的配置 4.使用Sublime编写并调试Pytho ...

  8. 『无为则无心』Python基础 — 6、Python的注释

    目录 1.注释的作用 2.注释的分类 单行注释 多行注释 3.注释的注意事项 4.什么时候需要使用注释 5.总结 提示:完成了前面的准备工作,之后的文章开始介绍Python的基本语法了. Python ...

  9. 『无为则无心』Python基础 — 7、Python的变量

    目录 1.变量的定义 2.Python变量说明 3.Python中定义变量 (1)定义语法 (2)标识符定义规则 (3)内置关键字 (4)标识符命名习惯 4.使用变量 1.变量的定义 程序中,数据都是 ...

随机推荐

  1. [DB] SQL 必知必会

    整体架构 数据类型 文本类:CHAR.VARCHAR(可变长度字符,多使用).TEXT.LONGTEXT(文本较大时使用) 数字类:TINYINT.INT.BIGINT.FLOAT.DOUBLE 日期 ...

  2. 009.Python字符串相关函数

    字符串相关函数 1 capitalize 字符串首字母大写 strvar = "this is a dog" res = strvar.capitalize() print(res ...

  3. linux系统瓶颈分析(精) CPU Memory IO Network

    linux系统瓶颈分析(精) linux系统瓶颈分析(精) (2013-09-17 14:22:00)   分类: linux服务器瓶颈分析 1.0 性能监控介绍性能优化就是找到系统处理中的瓶颈以及去 ...

  4. sprintf和snprintf函数

    printf()/sprintf()/snprintf()区别  先贴上其函数原型 printf( const char *format, ...)    格式化输出字符串,默认输出到终端-----s ...

  5. vue 表格中的下拉框单选、多选处理

    最近在用vue做前后端分离,需要在表格中用到下拉框,由于需求变动,从最开始的单选变为多选,折腾了许久,记录一下,供后人铺路 vue 中的表格下拉框单选 collectionsColnumOptions ...

  6. windows server 2008 rdp停止服务 - windows server 2012 R2 远程桌面授权模式尚未配置,远程桌面服务将在120天内停止工作

    目录 问题现象 增长rdp服务可使用时长的配置 Via & reference: 问题现象 windows server 2008作为测试环境跳板机,但是没有配置官方的rdp授权,限制用户登录 ...

  7. 启动dubbo消费端过程提示No provider available for the service的问题定位与解决

    文/朱季谦 某次在启动dubbo消费端时,发现无法从zookeeper注册中心获取到所依赖的消费者API,启动日志一直出现这样的异常提示 Failed to check the status of t ...

  8. Python+Selenium学习笔记10 - send_keys上传文件

    在火狐浏览器上传文件 上传前,同一个HTML文件在火狐和Edge浏览器显示有些不同 这是Firefox浏览器的显示 这是Edge浏览器 上传后 1 # coding = utf-8 2 3 from ...

  9. Java处理Excel中的日期格式

    Java处理Excel中的日期格式 2011-12-23 17:34:03|  分类: java |举报 |字号 订阅 下载LOFTER 我的照片书  |   在Excel中的日期格式,其数值为距离1 ...

  10. Javascript和Typescript语言类型

    静态语言(强类型语言) 静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型. 例如:C++.Java.Delphi.C#等. 动态语言(弱类型语言) 动 ...