文章目录
可以通过名称来访问各个值的数据结构,成为映射(mapping),字典是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下。键可能是数,字符串或元组。
1 字典的用途
字典旨在让你能够轻松的找到特定的单词(键),以获取其定义(值)。如:
- 表示棋盘的状态,其中每个键都是由坐标组成的元组;
- 存储文件修改的时间,其中键为文件名;
- 数字电话/地址簿。
2 基本用法
字典由键及其相应的值组成,这种键值对成为项(item)。如:
>>> people = {'Li' : 886, 'tang': 12}
>>> people
{'Li': 886, 'tang': 12}
每个键与其值之间都用冒号分隔,项之间用逗号分隔,而整个字典放在花括号内。
2.1 创建字典
使用函数 dict从其他映射或者键值对序列创建字典。
>>> items = [('name', 'Li'), ('age', 27)]
>>> d = dict(items)
>>> d
{'name': 'Li', 'age': 27}
>>> d['name']
'Li'
还可以使用关键字实参来调用这个函数。
>>> d = dict(name = 'Li', age = 27)
>>> d
{'name': 'Li', 'age': 27}
2.2 基本操作
字典的基本操作在很多方面都类似于序列:
- len()d返回字典d包含的键值对数;
- d[k]返回与键k相关联的值;
- d[k] = v将值v关联到键k;
- del d[k]删除键为k的项;
- k in d检查字典d是否包含键为k的项。
以下是跟序列一些重要的不同之处:
- 键的类型:可以是任何不可变的类型,如实数,字符串或元组;
- 自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。
- 成员资格:表达式k in d(字典)查找的是键而不是值,而表达式v in l(列表)查找的是值而不是索引。
2.3 将字符串格式设置功能用于字典
在字典中存储一系列键值对,只需要在格式字符串中提取所需的信息即可,可通过format_map来通过一个映射来提供所需的信息。
>>> people = {'Li' : 886, 'tang': 12}
>>> "Li's number is {Li}".format_map(people)
"Li's number is 886"
在使用字典时,可指定任意数量的转换说明符,条件是所有字段名都是包含在字典中的键 。
在模板系统中,这种 字符串格式设置方式很有用
>>> template = '''<html>
... <head><title>{title}</title></head>
... <body>
... <h1>{title}<h1>
... <p>{text}<p>
... </body>'''
>>> data = {'title':'this is a title', 'text':'I am a text'}
>>> print(template.format_map(data))
<html>
<head><title>this is a title</title></head>
<body>
<h1>this is a title<h1>
<p>I am a text<p>
</body>
2 字典方法
下面介绍一些常用的方法。
2.1 clear
方法clear删除所有的字典项。
>>> d = {}
>>> d['name'] = 'Li'
>>> d['age'] = 27
>>> d
{'name': 'Li', 'age': 27}
>>> d.clear()
>>> d
{}
copy
方法copy返回的是一个新字典,其包含的键值对与原来的字典相同。但这个方法执行的是浅复制,因为值本身是原件,而非副本。
>>> x = {'username':'Li', 'machine':['P20', 'mac', 'thinkpad']}
>>> y = x.copy()
>>> y['username'] = 'tang'
>>> y['machine'].remove('mac')
>>> y
{'username': 'tang', 'machine': ['P20', 'thinkpad']}
>>> x
{'username': 'Li', 'machine': ['P20', 'thinkpad']}
如上述示例,当替换副本中的值时,原件不受影响。然而如果修改副本中的值,原件也就发生变化,因为原件指向的也是被修改的值(就地修改而不是替换)。
还有一种方法,就是深复制deepcopy,即同时复制值和包含的所有的值。
>>> from copy import deepcopy
>>> x = {'username':'Li', 'machine':['P20', 'mac', 'thinkpad']}
>>> y = deepcopy(x)
>>> y['username'] = 'tang'
>>> y['machine'].remove('mac')
>>> y
{'username': 'tang', 'machine': ['P20', 'thinkpad']}
>>> x
{'username': 'Li', 'machine': ['P20', 'mac', 'thinkpad']}
>>>
2.3 fromkeys
方法fromkeys创建了一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> dict.fromkeys(['name', 'age'])
{'name': None, 'age': None}
2.4 get
方法get的作用与普通的字典查找相同。
如果使用通常的方法访问字典中没有的项会报错,而使用get则不会
>>> d = {}
>>> d['name']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print(d.get('name'))
None
使用get来访问不存在的键时,可指定默认值。(可用来做提示语等功能)
>>> d.get('name', 'N/A')
'N/A'
2.5 items
方法items返回一个包含所有字典项的列表,其中每个元素都为键值对的形式,但字典项在列表中的排序不确定。
>>> people = {'Li' : 886, 'tang': 12, 'lin': 126}
>>> people.items()
dict_items([('Li', 886), ('tang', 12), ('lin', 126)])
其返回值成为字典视图,可用于迭代,也可确定其长度以及对其执行成员资格检查。
>>> it = people.items()
>>> len(it)
3
>>> ('Li',886) in it
True
2.6 keys
方法keys返回一个字典视图,包含指定字典中的键
>>> people.keys()
dict_keys(['Li', 'tang', 'lin'])
2.7 values
方法values返回一个由字典中的值组成的字典视图,values返回的视图可能包含重复的值。
>>> d = {'a' : 1, 'b' : 2, 'c' : 1}
>>> d.values()
dict_values([1, 2, 1])
2.8 pop
方法pop可用于获取与指定键相关联的值,并将该键值对从字典中删除。
>>> people.pop('lin')
126
>>> people
{'Li': 886, 'tang': 12}
2.9 popitem
方法popitem类似于list.pop,但list.pop弹出列表最后一个元素,而popitem随机地弹出一个字典项,因为字典本身没有顺序。
>>> people.popitem()
('tang', 12)
>>> people
{'Li': 886}
>>> people.popitem()
('Li', 886)
>>> people
{}
2.10 setdefault
方法setdefault有点像get,因为它也获取 与指定键相关联的值,但除此之外,setdefault还在字典不包含指定的键,在字典中添加指定的键值对。
>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Li'
>>> d.setdefault('name', 'N/A')
'Li'
>>> d
{'name': 'Li'}
2.11 update
方法update使用一个字典中的项来更新另一个字典。
>>> people = {'Li' : 886, 'tang': 12}
>>> x = {'lin': 126, 'phone': 'x'}
>>> people.update(x)
>>> people
{'Li': 886, 'tang': 12, 'lin': 126, 'phone': 'x'}
来源:CSDN
作者:糖冰橙
链接:https://blog.csdn.net/tt75281920/article/details/104464460