字典是Python中唯一的内置映射类型。
Python3.6(包含)之后,所有的普通dict()字典都变为有序的了。
参考文章:https://www.kingname.info/2019/07/13/python-dict/
一、创建字典
1、字典由键及其对应的值组成
>>> dict = {'Mike': 40, 'John': 30}
在字典中,键必须是独一无二的。
字典中的键可以是任何不可变的类型,如整数、浮点数、字符串和元组。
2、函数dict
可使用函数dict(实际是一个类)从其他键-值对序列或者其他字典创建字典。
>>> lst = [('Mike', 40), ('John', 30)] >>> d = dict(lst) >>> d {'Mike': 40, 'John': 30} >>> >>> >>> d2 = dict(d) >>> d2 {'Mike': 40, 'John': 30} >>>
还可使用关键字实参来调用这个函数:
>>> d = dict(name='Mike', age=40) >>> d {'name': 'Mike', 'age': 40}
二、基本的字典操作
字典的基本行为在很多方面都类似于序列。
>>> d = {'Mike': 40, 'John': 30}
1、len(d):返回字典d包含的项数。
>>> len(d)
2
2、d[k]:返回与键k相关联的值。如果不存在会发生异常。
>>> d['Mike'] 40
>>> d['Mik']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Mik'
3、d[k] = v:将值v关联到键k。
>>> d['Mike'] = 50 >>> d {'Mike': 50, 'John': 30}
4、del d[k]:删除键为k的项。如果不存在会发生异常。
>>> del d['Mike'] >>> d {'John': 30}
>>> del d['Mik']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Mik'
5、k in d:检查字典d是否包含键为k的项。
>>> 'John' in d True
三、字典方法
1、clear
方法clear删除所有的字典项。
>>> d = {'Mike': 40, 'John': 30} >>> d.clear() >>> d {}
2、copy(浅拷贝)
方法copy返回一个新字典,这个方法执行的是浅拷贝,值本身是原件而非副本。
>>> x = {'username': 'admin', 'machines': ['a', 'b', 'c']} >>> y = x.copy() >>> y {'username': 'admin', 'machines': ['a', 'b', 'c']} >>> y['username'] = 'guido' >>> y['machines'].remove('a') >>> y {'username': 'guido', 'machines': ['b', 'c']} >>> x {'username': 'admin', 'machines': ['b', 'c']} >>>
如上所见,当替换副本中的值时,原件不受影响;
然而,如果修改副本中的值,原件也将发生变化。
3、deepcopy(深拷贝)
深拷贝会同时复制值及其包含的所有值。
>>> x = {'username': 'admin', 'machines': ['a', 'b', 'c']} >>> from copy import deepcopy >>> y = deepcopy(x) >>> y['username'] = 'guido' >>> y['machines'].remove('a') >>> y {'username': 'guido', 'machines': ['b', 'c']} >>> x {'username': 'admin', 'machines': ['a', 'b', 'c']}
4、fromkeys
方法fromkeys创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> dict.fromkeys(['name', 'age']) {'name': None, 'age': None}
也可以提供默认值:
>>> dict.fromkeys(['name', 'age'], 'unknown') {'name': 'unknown', 'age': 'unknown'}
5、get
方法get获取指定键对应的值,如果不存在则返回None,也可以指定默认值。
>>> d.get('Mike') 40 >>> d.get('Mik') >>> d.get('Mik', 'N/A') 'N/A'
6、items
方法items返回一个字典视图,其中包含所有字典项,可用于迭代。其中每个元素都是(key, value)的形式。
可对视图进行长度以及成员资格的检查。
>>> d = {'Mike': 40, 'John': 30} >>> d.items() dict_items([('Mike', 40), ('John', 30)]) >>> it = d.items() >>> len(it) 2 >>> ('Mike', 40) in it True
也可以转换成列表。
>>> list(d.items()) [('Mike', 40), ('John', 30)]
7、keys
方法keys返回一个字典视图,其中包含指定字典中的键。
>>> d = {'Mike': 40, 'John': 30} >>> d.keys() dict_keys(['Mike', 'John'])
8、values
方法values返回一个字典视图,其中包含指定字典中的值。
>>> d = {'Mike': 40, 'John': 30} >>> d.values() dict_values([40, 30])
9、pop
方法pop可用于获取与指定键相关联的值,并将该键-值对从字典中删除。如果不存在会发生异常。
>>> d = {'Mike': 40, 'John': 30} >>> d.pop('Mike') 40 >>> d {'John': 30} >>> d.pop('Mik') Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'Mik'
10、popitem
方法popitem随机地弹出一个字典项。从Python3.6开始会弹出最后一个元素。
>>> d = {'Mike': 40, 'John': 30, 'Jack': 20} >>> d.popitem() ('Jack', 20)
11、setdefault
方法setdefault类似get,因为它也获取与指定键相关联的值。
>>> d = {'Mike': 40, 'John': 30, 'Jack': 20} >>> d.setdefault('Mike') 40
如果字典不包含指定的键,则在字典中添加指定的键-值对,默认为None。
>>> d.setdefault('Mik') >>> d {'Mike': 40, 'John': 30, 'Jack': 20, 'Mik': None} >>> d.setdefault('Jac', 18) 18 >>> d {'Mike': 40, 'John': 30, 'Jack': 20, 'Mik': None, 'Jac': 18}
12、update
方法update使用一个字典中的项来更新另一个字典。
>>> d = {'Mike': 40, 'John': 30, 'Jack': 20}
>>> e = {'Mike': 50, 'Rose': 18}
>>> d.update(e)
>>> d
{'Mike': 50, 'John': 30, 'Jack': 20, 'Rose': 18}
如果当前字典包含键相同的项,就更新它。
如果当前字典不包含对应的项,就添加它。
四、遍历字典
1、遍历键值
>>> d = {'Mike': 40, 'John': 30, 'Jack': 20} >>> for key in d: ... print(key + ': ' + str(d[key])) ... Mike: 40 John: 30 Jack: 20 >>> >>> >>> for key in d.keys(): ... print(key + ': ' + str(d[key])) ... Mike: 40 John: 30 Jack: 20
for key in 与 for key in d.keys() 这两种遍历方法在使用上是完全等价的。
2、遍历内容值
>>> for value in d.values(): ... print(value) ... 40 30 20
3、遍历字典项
>>> for key, value in d.items(): ... print(key + ': ' + str(value)) ... Mike: 40 John: 30 Jack: 20
五、将字符串格式设置功能用于字典
通过在字典中存储一系列命名的值,可让格式设置更容易些。
必须使用format_map来指出你将通过一个映射来提供所需的信息。
>>> d = {'Mike': 40, 'John': 30} >>> "Mike's age is {Mike}".format_map(d) "Mike's ange is 40"