字典
一种可通过名称来访问其各个值的数据结构。这种数据结构称为映射(mapping)。字典是Python中唯一的内置映射类型,
其中的值不按顺序排列,而是存储在键下。键可能是数、字符串或元组。
创建字典
# 字典以类似于下面的方式表示:
phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
函数 dict
可使用函数 dict 从其他映射(如其他字典)或键-值对序列创建字典。
>>> items = [('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'
还可使用关键字实参来调用这个函数,如下所示:
>>> d = dict(name='Gumby', age=42)
>>> d
{'age': 42, 'name': 'Gumby'}
基本字典操作
# 字典的基本行为在很多方面都类似于序列。
len(d) 返回字典 d 包含的项(键值对)数。
d[k] 返回与键 k 相关联的值。
d[k] = v 将值 v 关联到键 k 。
del d[k] 删除键为 k 的项。
k in d 检查字典 d 是否包含键为 k 的项。
# 虽然字典和列表有多个相同之处,但也有一些重要的不同之处
键的类型:字典中的键可以是整数,但并非必须是整数。字典中的键可以是任何【不可变】的类型,如浮点数(实数)、字符串或元组。
自动添加:即便是字典中原本没有的键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不使用 append 或其他类似的方法,就不能给列表中没有的元素赋值。
成员资格:表达式 k in d (其中 d 是一个字典)查找的是键而不是值,而表达式 v in l (其中 l 是一个列表)查找的是值而不是索引
字典方法
1. clear 删除所有的字典项 这种操作是就地执行的(就像 list.sort 一样),因此什么都不返回(或者说返回 None )
>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print(returned_value)
None
2. copy 返回一个新字典,其包含的键值对与原来的字典相同(这个方法执行的是浅复制,因为值本身是原件,而非副本)
>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> 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 创建一个新字典,其中包含指定的键,且每个键对应的值都是 None
>>> {}.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> dict.fromkeys(['name', 'age'])
{'age': None, 'name': None}
如果你不想使用默认值 None ,可提供特定的值。
>>> dict.fromkeys(['name', 'age'], '(unknown)')
{'age': '(unknown)', 'name': '(unknown)'}
4. get
如果你试图访问字典中没有的项,将引发错误。
>>> d = {}
>>> print(d['name'])
Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'name'
而使用 get 不会这样:
>>> print(d.get('name'))
None
你可指定“默认”值,这样将返回你指定的值而不是 None 。
>>> d.get('name', 'N/A')
'N/A'
5. items 返回一个包含所有字典项的列表,其中每个元素都为 (key, value) 的形式
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.items()
dict_items([('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')])
6. keys 返回一个字典视图,其中包含指定字典中的键
7. pop 可用于获取与指定键相关联的值,并将该键值对从字典中删除
>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}
8. popitem popitem 类似于 list.pop ,但 list.pop 弹出列表中的最后一个元素,而 popitem 随机地弹出一个字典项,
因为字典项的顺序是不确定的,没有“最后一个元素”的概念
>>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python Web Site'}
9. setdefault 它也获取与指定键相关联的值,但除此之外, setdefault还在字典不包含指定的键时,在字典中添加指定的键值对
>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name', 'N/A')
'Gumby'
>>> d
{'name': 'Gumby'}
10. update 使用一个字典中的项来更新另一个字典
>>> d = {
... 'title': 'Python Web Site',
... 'url': 'http://www.python.org',
... 'changed': 'Mar 14 22:09:15 MET 2016'
... }
>>> x = {'title': 'Python Language Website'}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'changed':
'Mar 14 22:09:15 MET 2016', 'title': 'Python Language Website'}
11. values 返回一个由字典中的值组成的字典视图
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
dict_values([1, 2, 3, 1])