列表这种数据结构适合于将值组织到一个结构中,并且通过编号对其进行引用。
今天将学到一种通过名字来引用值得数据结构,这种数据结构称为映射(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