python dict 字典详解

和列表相同,字典也是许多数据的集合,属于可变序列类型。不同之处在于,它是无序的可变序列,其保存的内容是以“键值对”的形式存放的。

字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。

字典类型很像学生时代常用的新华字典。我们知道,通过新华字典中的音节表,可以快速找到想要查找的汉字。其中,字典里的音节表就相当于字典类型中的键,而键对应的汉字则相当于值。

表 1 Python 字典特征
主要特征解释
通过键而不是通过索引来读取元素字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。
字典是任意数据类型的无序集合和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素。而字典中的元素是无序的。
字典是可变的,并且可以任意嵌套字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典。
字典中的键必须唯一字典中,不支持同一个键出现多次,否则,只会保留最后一个键值对。
字典中的键必须不可变字典中的值是不可变的,只能使用数字、字符串或者元组,不能使用列表。

Python 中的字典类型相当于 Java 或者 C++ 中的 Map 对象。

1) 花括号语法创建字典

于字典中每个元素都包含 2 部分,分别是键和值,因此在创建字典时,键和值之间使用冒号分隔,相邻元素之间使用逗号分隔,所有元素放在大括号 {} 中。

Python 字典类型的语法格式如下:

key: valuen 表示各个元素的键值对。需要注意的是,同一字典中各个元素的键值必须唯一。

dictname = {'key':'value1','key2':'value2',...,'keyn':valuen}
[root@kube dict]# cat demo.py 
#coding:utf-8

scores = {'语文':89,'数学':100,'化学':90}
print(type(scores))
a_scores = {'语文':89,'数学':(44,55),'化学':[90,66]}          #key 键不能是列表会报错
print(a_scores)


[root@kube dict]# py demo.py 
<class 'dict'>
{'语文': 89, '数学': (44, 55), '化学': [90, 66]}
[root@kube dict]# 

2) 通过 fromkeys() 方法创建字典

Python 中,还可以使用 dict 字典类型提供的 fromkeys() 方法创建所有键值为空的字典,使用此方法的语法格式为:

dictname = dict.fromkeys(list,value=None)
[root@kube dict]# cat demo1.py 
s_name = {'语文','数学','英语'}
scores = dict.fromkeys(s_name)
print(type(scores))
print(scores)
[root@kube dict]# py demo1.py 
<class 'dict'>
{'数学': None, '英语': None, '语文': None}
[root@kube dict]#

3) 通过 dict() 映射函数创建字典

通过 dict() 函数创建字典的写法有多种,表 2 罗列出了常用的几种方式,它们创建的都是同一个字典 a。

表 2 dict() 函数创建字典
创建格式注意事项
>>> a = dict(one=1,two=2,three=3)注意,其中的 one、two、three 都是字符串,但使用此方式创建字典时,字符串不能带引号。
>>> demo = [('two',2),('one',1),('three',3)] #方式1

>>> demo = [['two',2],['one',1],['three',3]] #方式2

>>> demo = (('two',2),('one',1),('three',3)) #方式3

>>> demo = (['two',2],['one',1],['three',3]) #方式4

>>> a = dict(demo)

向 dict() 函数传入列表或元组,而它们中的元素又各自是包含 2 个元素的列表或元组,其中第一个元素作为键,第二个元素作为值。
>>> demokeys = ['one','two','three'] #还可以是字符串或元组

>>> demovalues = [1,2,3] #还可以是字符串或元组

>>> a = dict(zip(demokeys,demovalues))

通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。

注意,无论采用以上哪种方式创建字典,字典中各元素的键都只能是字符串、元组或数字,不能是列表。

python 访问字典

和列表、元组不同,它们访问元素都是通过下标,而字典不同,它是通过键来访问对应的元素值。

因为字典中元素是无序的,所以不能像列表、元组那样,采用切片的方式一次性访问多个元素。

Python 更推荐使用 dict 类型提供的 get() 方法获取指定键的值。get() 方法的语法格式为:

dict.get(key[,default])
[root@kube dict]# cat demo1.py 
scores = {'语文':60,'数学':70,'英语':80}
print(scores.get('语文'))
print(scores.get('英语'))     #通过get 函数获取值
del scores                   #del 删除字典
print(scores)

[root@kube dict]# py demo1.py 
60
80
Traceback (most recent call last):
  File "demo1.py", line 5, in <module>
    print(scores)
NameError: name 'scores' is not defined
[root@kube dict]# 

python dict 字典基本操作

由于字典属于可变序列,所以我们可以任意操作字典中的键值对(key-value 对)。Python 中,常见的字典操作有以下几种:

    1. 向现有字典中添加新的键值对。
    2. 修改现有字典中的键值对。
    3. 从现有字典中删除指定的键值对。
    4. 判断现有字典中是否存在指定的键值对。

Python字典添加键值对

如果要为 dict 添加键值对,只需为不存在的 key 赋值即可。实现此操作的语法格式如下:
dict[key] = value 
表 1 Python 字典添加键值对语法参数
参数含义
dict表示字典名称。
key表示要添加元素的键。注意,既然是添加新的元素,那么就要保证此元素的键和字典中现有元素的键互不相同。
value表示要添加数据的值,只要是 Python 支持的数据类型就可以。
[root@kube dict]# cat demo2.py 
a = dict()             #用 duict 函数定义一个空的字典
print(a)
print(type(a))          
a['语文'] = 100          #定义字典中的 key  值并给定 value ,相当于字典添加键值对
a['数学'] = 80
a['地理'] = 90
print(a)
a['语文'] = 88888         #给 相同key  重新赋值相当于修改 key 的value 
print(a)
del a['地理']              #删除对应的 key  ,同时也删除 key  对应的 value
print(a)

[root@kube dict]# py demo2.py 
{}
<class 'dict'>
{'语文': 100, '数学': 80, '地理': 90}
{'语文': 88888, '数学': 80, '地理': 90}
{'语文': 88888, '数学': 80}
[root@kube dict]# 

python 字典dict 完全攻略

字典的数据类型为 dict,我们可使用 dir(dict) 来查看该类包含哪些方法

>>> dir(dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> 

python keys() ,values() ,items() 函数

这 3 个方法之所以放在一起介绍,是因为它们都用来获取字典中的特定数据。keys() 方法用于返回字典中的所有键;values() 方法用于返回字典中所有键对应的值;items() 用于返回字典中所有的键值对。

[root@kube dict]# cat demo3.py 
scores = {'语文':60,'数学':70,'英语':80}

print(scores.keys())
print(scores.values())
print(scores.items())
[root@kube dict]# py demo3.py 
dict_keys(['语文', '数学', '英语'])
dict_values([60, 70, 80])
dict_items([('语文', 60), ('数学', 70), ('英语', 80)])
[root@kube dict]# 
[root@kube dict]# 
[root@kube dict]# cat  demo4.py 
a = {'数学': 95, '语文': 89, '英语': 90}
for k in a.keys():
    print(k,end=' ')
print("\n---------------")
for v in a.values():
    print(v,end=' ')
print("\n---------------")
for k,v in a.items():
    print("key:",k," value:",v)
[root@kube dict]# py demo4.py 
数学 语文 英语 
---------------
95 89 90 
---------------
key: 数学  value: 95
key: 语文  value: 89
key: 英语  value: 90
[root@kube dict]# 

python copy 方法

copy() 方法用于返回一个具有相同键值对的新字典

[root@kube dict]# cat demo5.py 
a = {'one':1,'two':2,'three':[3,2,1]}
b = a.copy()
print(b)
[root@kube dict]# py demo5.py 
{'one': 1, 'two': 2, 'three': [3, 2, 1]}
[root@kube dict]# 
注意,copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。拿拷贝字典 a 为例,copy() 方法只会对最表层的键值对进行深拷贝,也就是说,它会再申请一块内存用来存放 {'one': 1, 'two': 2, 'three': []};而对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,b 中的 [1,2,3] 的值不是自己独有,而是和 a 共有。

python update 方法

update() 方法可使用一个字典所包含的键值对来更新己有的字典。

在执行 update() 方法时,如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。

[root@kube dict]# cat demo6.py 
a = {'one':1,'two':2}
a.update({'one':5.5,'three':3.3})
print(a)
[root@kube dict]# py demo6.py 
{'one': 5.5, 'two': 2, 'three': 3.3}
[root@kube dict]# 

python pop() 方法

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.pop('one'))
print(a)
[root@kube dict]# py demo7.py 
1
{'two': 2, 'three': 3}
[root@kube dict]# 

python popitem() 方法

popitem() 方法用于随机弹出字典中的一个键值对。

注意,此处的随机其实是假的,它和 list.pop() 方法一样,也是弹出字典中最后一个键值对。但由于字典存储键值对的顺序是不可知的,因此 popitem() 方法总是弹出底层存储的最后一个键值对。

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.popitem())
print(a)
print(a.popitem())
print(a)
[root@kube dict]# py demo7.py 
('three', 3)
{'one': 1, 'two': 2}
('two', 2)
{'one': 1}
[root@kube dict]# 

python setdefault() 方法

setdefault() 方法也用于根据 key 来获取对应 value 的值。但该方法有一个额外的功能,即当程序要获取的 key 在字典中不存在时,该方法会先为这个不存在的 key 设置一个默认的 value,然后再返回该 key 对应的 value。

也就是说,setdefault() 方法总能返回指定 key 对应的 value;如果该键值对存在,则直接返回该 key 对应的 value;如果该键值对不存在,则先为该 key 设置默认的 value,然后再返回该 key 对应的 value。

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.setdefault('four'))                 #添加four 不存在的键,value默认 None
print(a)
print(a.setdefault('five',2.3))              #添加不存在的键值对,会添加
print(a)
print(a.setdefault('one',5.5))                #添加已存在的键值,不会添加
print(a)


[root@kube dict]# py demo7.py 
None
{'one': 1, 'two': 2, 'three': 3, 'four': None}
2.3
{'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3}
1
{'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3}
[root@kube dict]# 

python 使用字典格式化字符串

格式化字符串时,如果要格式化的字符串模板中包含多个变量,后面就需要按顺序给出多个变量,这种方式对于字符串模板中包含少量变量的情形是合适的,但如果字符串模板中包含大量变量,这种按顺序提供变量的方式则有些不合适。

这时,就可以使用字典对字符串进行格式化输出,具体方法是:在字符串模板中按 key 指定变量,然后通过字典为字符串模板中的 key 设置值。

[root@kube dict]# cat demo8.py 
#coding:utf-8
#定义字符串模板的转化说明符

temp = '姓名:%(name)s,年龄:%(age)3.0f,籍贯:%(location)s'

msg = {'name': 'JoJ','age':23,'location':'海拉尔群岛'}
print(temp % msg)
[root@kube dict]# py demo8.py 
姓名:JoJ,年龄: 23,籍贯:海拉尔群岛
[root@kube dict]#