【五】字典

列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。

今天将学到一种通过名字来引用值得数据结构,这种数据结构称为映射(mapping)。

字典是Python中唯一内建的映射类型,字典中的值没有特殊的顺序,但是都存储在一个特定的键(Key)下。

一.字典的引入

字典也是 Python提供的一种常用的数据结构,它用于存放具有映射关系的数据。

在数学里,映射是个术语,指两个元素的集之间元素相互“对应”的关系,

比如有份成绩表数据,语文:79,数学:80,英语:92,这组数据看上去像两个列表,但这两个列表的元素之间有一定的关联关系。如果单纯使用两个列表来保存这组数据,则无法记录两组数据之间的关联关系。

为了保存具有映射关系的数据,Python 提供了字典,字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key;另一组数据可通过 key 来访问,被称为 value。形象地看,字典中 key 和 value 的关联关系如图 1 所示:


 

字典保存的关联数据


由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。

程序既可使用花括号语法来创建字典,也可使用 dict() 函数来创建字典。实际上,dict 是一种类型,它就是 Python 中的字典类型。

二.字典的定义

字典(Dictionary)在Python中是一种可变的容器模型,它是通过一组键(key)值(value)对组成,这种结构类型通常也被称为映射,或者叫关联数组,也有叫哈希表的。

每个key-value之间用“:”隔开,每组用“,”分割,整个字典用“{}”括起来。

注意:

  • 定义字典时,键在前,值在后,键必须唯一性,值可以不唯一,如果键有相同,值则取最后一个;
  • 值可以是任何的数据类型,但是键必须是不可变的数据类型(数字、字符串、元组);
d1 = {'Alice': '2341', 9102: 'Bibi', (11,22): '3258'}  # 正确
d2 = {['Alice',123]: '2341', True: '9102', {'abc': '123', 'efg': '456'}}  # 错误! 因为列表 布尔值 字典都是可变的,不能作为键(key)
  • 定义的时候,字典是{},列表是[],元组是();
  • 字典是无序的,每次执行打印,顺序都会发生改变 
d = {'Alice': '2341', 9102: 'Bibi', (11,22): '3258'}
print(d)

# 打印结果可能是这样
{'Alice': '2341', 9102: 'Bibi', (11, 22): '3258'}

# 也有可能是这样
{(11, 22): '3258', 'Alice': '2341', 9102: 'Bibi'}

# 甚至可能是这样
{9102: 'Bibi', 'Alice': '2341', (11, 22): '3258'}

二.字典的创建

1.创建空字典

#空字典
>>> var = dict()
>>> print(var,type(var))
{} <class 'dict'>

 2.创建具有多个数据的字典

#1.
var = {'黑':'black','白':'white','蓝':'blue'}
print(var,type(var))

#2.
var = dict({'黑':'black','白':'white','蓝':'blue'})
print(var,type(var))

#3.
var = dict(黑 = 'black',白 = 'white',蓝 = 'blue')
print(var,type(var))

#4.
var = [
    ['黑','black'],
    ['白','white'],
    ['蓝','blue']
]
result = dict(var)
print(result,type(result))

#5.
keys = ['黑','白','蓝']
values = ['black','white','blue']
result = dict(zip(keys,values))
print(result,type(result))

三.字典的基本操作

#基本操作
var = {'赵云':'子龙','庞统':'士元','郭嘉':'奉孝','鲁肃':'子敬'}
1.访问字典:
print(var['赵云'])

2.修改字典
var['郭嘉'] = '天妒'

3.删除元素
del var['郭嘉']

4.添加元素
var['周瑜'] = '公瑾'

5.序列操作
#成员检测 ->针对于键的操作而不是值
var = {'赵云':'子龙','庞统':'士元','郭嘉':'奉孝','鲁肃':'子敬'}
result = '士元' in var
print(result)

6.len()  检测字典中元素的个数
var =  {'赵云':'子龙','庞统':'士元','郭嘉':'奉孝','鲁肃':'子敬'}
result = len(var)
print(result)

7.max()  获取字典中最大的键如果不是数字键 获取最大编码的值
var = {'a':1,'b':2,'c':3,'晷':12}
result = max(var)
print(result)

8.min() 获取字典中最小的键如果不是数字键 获取最小编码的值
var = {'a':1,'b':2,'c':3,'晷':12}
result = min(var)
print(result)

9.字典的遍历
var = {'赵云':'子龙','庞统':'士元','郭嘉':'奉孝','鲁肃':'子敬'}

#方法1:先遍历键,再使用变量和键来获取对应的值
for i in var:
    print(i,var[i])

#方法2:同时遍历键和值
result = var.items()
print(result,type(result))#不是标准的列表类型
for k,v in var.items():
    print(k,v)

10.字典推导式
var = {'ag':'sfsf','bg':'fsdf','cg':'df'}

#普通推导式
result = {k:v for k,v in var.items()}
print(result)

#带有判断条件的推导式
result = { k:v for k,v in var.items() if len(v) == 2}
print(result)

#多循环的字典推导式
girls= {'zb':'bo','mm':'mei','jj':'jun'}
boys = {'ll':'le','ff':'fei','ji':'jiao'}

result = { g+b:gv +bv for g,gv in girls.items() for b,bv in boys.items()}
print(result)

11.str(dict)      #输出字典可以打印的字符串表示
d = {'Year': 2018, 'Month': 3, 'Day': 18}
content = str(d6)
print(content)
打印结果:{'Year': 2018, 'Month': 3, 'Day': 18}

12.type(variable)   #返回输入的变量类型,如果变量类型是字典就返回字典
d= {'Year': 2018, 'Month': 3, 'Day': 18}
ty = type(d8)
print(ty)
打印结果:<class 'dict'>

四.字典的方法

就像其他的内建类型一样,字典也有方法。这些方法非常有用,但是有可能不会像列表或者字符串方法那样被频繁地使用。

#字典相关函数

var = {'孙行者':'孙悟空','沙和尚':'沙悟净','猪八戒':'猪悟能'}
1.clear 清空字典
var.clear()
print(var,id(var))

2.copy() 复制字典
newvar = var.copy()
print(newvar,id(newvar))

3.fromkeys()  使用序列(键)和指定的值(值)制作一个字典
list = ['fda','fsd','jgj','hfg']
result = dict.fromkeys(list,'小鸟')
result = {}.fromkeys(list,'小鸟')
print(result)

4.get()  获取字典中指定键的值
result = var.get('猪八戒','默认值')#result =var['猪八戒']
print(result)

5.setdefault()  向字典中添加一个元素[不存在的键则添加,存在的键不做任何操作]
var.setdefault('小白龙','小白龙')
print(var)

6.update()  修改字典中的元素
var.update(孙行者 = '孙猴子')
print(var)

var.update({'孙行者':'齐天大圣','猪八戒':'天蓬元帅','唐僧':'唐玄奘'})
print(var)

7.pop()  删除字典中指定的元素
result = var.pop('唐僧')
print(var)
print(result)

8.popitem()  随机删除字典中的一个元素
result = var.popitem()
print(var)
print(result)

9.keys()  获取字典中的所有键组成的容器
var = {'苹果':'Apple','梨':'pear'}
result = var.keys()
print(result)
for i in result:
    print(i)

10.values()  获取字典中的所以值组成的容器
result = var.values()
print(result)

11.items()  获取字典中的所有键和值组成的2级容器
result = var.items()
print(result)

注意:copy和deepcopy:

  • copy浅复制
>>> x={'username':'admin','machines':['foo','bar','baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y=x.copy()
>>> y['username']='mlh'
>>> y
{'username': 'mlh', 'machines': ['foo', 'bar', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo', 'baz']}

 当副本中替换值的时候,原始字典不受影响。

但是,如果修改了某一个值(原地修改,而不是替换),原始的字典也会改变。

  • deepcpy深复制

解决上面的问题可以使用深复制,复制其所有的值,可以使用copy模块的deepcopy函数来完成操作。

>>> from copy import deepcopy
>>> d={}
>>> d['names']=['Alfred','Bertrand']
>>> c=d.copy()
>>> d
{'names': ['Alfred', 'Bertrand']}
>>> c
{'names': ['Alfred', 'Bertrand']}
>>> dc=deepcopy(d)
>>> dc
{'names': ['Alfred', 'Bertrand']}
>>> d['names'].append('Clive')
>>> d
{'names': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'names': ['Alfred', 'Bertrand']}

参考链接:

链接:https://www.cnblogs.com/suendanny/p/8593929.html

链接:https://www.cnblogs.com/sunyang945/p/7859930.html

链接:http://c.biancheng.net/view/2212.html

链接:https://baijiahao.baidu.com/s?id=1607756880586075003&wfr=spider&for=pc

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值