第4章 当索引行不通时
November 30, 2024
4.1 字典的用途
字典的名称指出这种数据结构的用途.
4.2 创建和使用字典
格式如下:
phonebook = {'Alice' : '2341', 'Beth': '9102', 'Cecil': '3258' }
4.2.1 函数 dict
使用 dict 函数从其他映射或键值对序列创建字典
>>> items = [('name', 'Gumby'), ('age', 42)] >>> >>> d = dict(items) >>> d {'name': 'Gumby', 'age': 42} >>> d['name'] 'Gumby' >>> d['age'] 42
也可使用 关键字实参 来调用这个函数
>>> d = dict(name='Gumby', age=42) >>> d {'name': 'Gumby', 'age': 42}
4.2.2 基本的字典操作
基本行为类似于序列
len(d)返回字典 d 包含的项数- `d[k] 返回与键 k 相关联的值
d[k] = v将值 v 关联到键 kdel d[k]删除键为 k 的项k in d检查字典 d 是否包含键为 k 的项 不同之处- 键的类型: 字典中的键可以是任何不可变的类型, 如浮点数 字符串 或元组
- 自动添加: 即使是字典中原本没有的键, 也可以给它复制, 这将在字典中创建一个新项, 而列表实现这种形式, 需要使用
append或者其他类似的方法实现 - 成员资格: 表达式 k in d(其中 d 是一个字典) 查找的是键而不是值, 而表达式 v in l(其中 l 是一个列表) 查找的是值而不是索引
>>> x = [] >>> x[42] = 'Foobar' Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> x = {} >>> x[42] = 'Foobar' >>> x {42: 'Foobar'}
4.2.3 将字符串格式设置功能用于字典
使用 format_map 函数来支持你将通过一个映射来提供所需信息
>>> phonebook = {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'} >>> phonebook {'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'} >>> "Cecil's phone number is {Cecil}.".format_map(phonebook) "Cecil's phone number is 3258.
使用模板系统, 来调用字典中的键
>>> template = '''<html> ... <head><title>{title}</title></head> ... <body> ... <h1>{title}</h1> ... <p>{text}</p> ... </body>''' >>> data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'} >>> print(template.format_map(data)) <html> <head><title>My Home Page</title></head> <body> <h1>My Home Page</h1> <p>Welcome to my home page!</p> </body>
4.2.4 字典方法
1. clear
方法 clear 删除所有的字典项, 没有返回
>>> d = {} >>> d['name'] = 'Gumby' >>> d['age'] = 42 >>> d {'name': 'Gumby', 'age': 42} >>> returned_value = d.clear() >>> d {} >>> print(returned_value) None
2. copy
copy 默认为浅复制, 修改复制后后副本, 原值同样改变
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']} >>> y = x.copy() >>> y['machines'].remove('bar') >>> y['username'] = 'mlh' >>> y {'username': 'mlh', 'machines': ['foo', 'baz']} >>> x {'username': 'admin', 'machines': ['foo', 'baz']}
深复制方法为 copy 模块中的 deepcopy 方法
>>> from copy import deepcopy >>> d = {} >>> d['names'] = ['Alfred', 'Bertrand'] >>> c = d.copy() >>> dc = deepcopy(d) >>> d['names'].append('Clive') >>> c {'names': ['Alfred', 'Bertrand', 'Clive']} >>> dc {'names': ['Alfred', 'Bertrand']}
3. fromkeys
方法 fromkeys 创建一个新字典, 其中包含指定的键, 且每个键对应的值都是 None
>>> {}.fromkeys('name', 'age') {'n': 'age', 'a': 'age', 'm': 'age', 'e': 'age'} >>> {}.fromkeys(['name', 'age']) {'name': None, 'age': None} >>> dict.fromkeys(['name', 'age']) {'name': None, 'age': None} >>> dict.fromkeys(['name', 'age'], '(unknow)') {'name': '(unknow)', 'age': '(unknow)'} >>> dict.fromkeys(['name', 'age'], 'unknow') {'name': 'unknow', 'age': 'unknow'}
4. get
get 用来获取字典中的值, 如果该值在字典中不存在, 也不会报错, 而是返回 None
>>> d = {} >>> print(d['name']) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'name' >>> print(d.get('name')) None
5. items
items 返回一个包含 所有字典项的列表, 每个元素都为 (key, value) 的形式. 字典项在列表中的排列顺序不确定.
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0} >>> d.items() dict_items([('title', 'Python Web Site'), ('url', 'http://www.python.org'), ('spam', 0)])
返回值属于一种名为 字典视图 的特殊类型. 可用于迭代.
6. keys
返回给定字典中的所有键
>>> d.keys() dict_keys(['title', 'url', 'spam'])
7. pop
用于获取与指定键相关联的值, 并从字典中删除该键值对
>>> d.pop('spam') 0 >>> d {'title': 'Python Web Site', 'url': 'http://www.python.org'}
8. popitem
类似于 list. pop , 但 list. pop 弹出列表中的最后一个元素, 而 popitem 随机弹出一个字典项, 可用于在不获取键列表的前提下, 快速删除所有字典项.
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0} >>> d.popitem() ('spam', 0) >>> d {'title': 'Python Web Site', 'url': 'http://www.python.org'}
9. setdefault
类似 get , 获取与指定键相关联的值, 另外也可以在字典中新加指定键值对
>>> d = {} >>> d.setdefault('name', 'N/A') 'N/A' >>> d {'name': 'N/A'} >>> d['name'] = 'Gumby' >>> d.setdefault('name', 'N/A') 'Gumby'
当指定键不存在时, setdefault 返回指定的值并更新字典, 如果执行的键存在, 则返回其值, 并保持字典不变
10. update
使用一个字典中的项来更新另外一个字典, 如果该键存在, 则更新该键的值为指定字典中的值, 如果该键不存在, 则将该键值对添加到当前字典中.
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0} >>> x = {'title': 'Python Language Website'} >>> d.update(x) >>> d {'title': 'Python Language Website', 'url': 'http://www.python.org', 'spam': 0} >>> y = {'title-new': 'Python Language Website new'} >>> d.update(y) >>> d {'title': 'Python Language Website', 'url': 'http://www.python.org', 'spam': 0, 'title-new': 'Python Language Website new'}
11. values
返回一个由字典中的值组成的字典视图. 不同于方法 keys, 方法 values 返回的视图可能包含重复的值
>>> d = {} >>> d[1] = 1 >>> d[2] = 2 >>> d[3] = 3 >>> d[4] = 1 >>> d.values() dict_values([1, 2, 3, 1])
4.3 小结
映射: 让你能够使用任何不可变的对象 (最常用的就是字符串和元组) 来标识其元素. Python 只有一种内置的映射类型, 那就是字典.
将字符串格式设置功能用于字典: 要对字典执行字符串格式设置操作, 不能使用 format 和命名参数, 而必须使用 format_map .
字典方法: 字典尊很多种方法, 这些方法的调用方式与列表和字符串的方法相同.