和列表相同,字典也是许多数据的集合,属于可变序列类型。不同之处在于,它是无序的可变序列,其保存的内容是以“键值对”的形式存放的。
字典中,习惯将各元素对应的索引称为键(key),各个键对应的元素称为值(value),键及其关联的值称为“键值对”。
字典类型很像学生时代常用的新华字典。我们知道,通过新华字典中的音节表,可以快速找到想要查找的汉字。其中,字典里的音节表就相当于字典类型中的键,而键对应的汉字则相当于值。
主要特征 | 解释 |
---|---|
通过键而不是通过索引来读取元素 | 字典类型有时也称为关联数组或者散列表(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。
创建格式 | 注意事项 |
---|---|
>>> 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 中,常见的字典操作有以下几种:
- 向现有字典中添加新的键值对。
- 修改现有字典中的键值对。
- 从现有字典中删除指定的键值对。
- 判断现有字典中是否存在指定的键值对。
Python字典添加键值对
如果要为 dict 添加键值对,只需为不存在的 key 赋值即可。实现此操作的语法格式如下:
dict[key] = value
参数 | 含义 |
---|---|
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]#