创建和使用字典
>>> phonebook = {'Alice':'2341','Beth':'9102','Cecil': '3258'}
函数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) 返回字典1d包含的项(键-值对)数。
- d[k] 返回与键k想关联的值。
- d[k] = v 将值b关联到键k。
- del d[k] 删除键为k的项。
- k in d 检查字典d是否包含键为 k 的项。
format_map
>>> phonebook
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}
>>> "Cecil's phone umber is {Cecil}.".format_map(phonebook)
"Cecil's phone number is 3258."
在模板系统中,这种字符串格式设置方式很有用(下面的示例使用的是HTML)。
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>
字典方法
clear
删除所有的字典项,就地执行的,因此什么都不返回(或者说返回None)。
>>> d = {'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print(returned_value)
None
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', 'machine': ['foo','baz']}
深复制,可以使用模块 copy 中的函数deepcopy
。
>>> from copy import deepcopy
>>> d = {'name': ['Alfred','Bertrand']}
>>> dc = deepcopy(d)
>>> d['name'].append('Clive')
>>> dc
{'name': ['alfred', 'Bertrand']}
fromkeys
创建一个新字典,其中包含指定的键,且每个键对应的值都是None。
>>> {}.fromkeys(['name','age'])
{'age': None,'name': None}
上面这个示例首先创建了一个空字典,再对其调用方法fromkeys
来创建另一个字典,这显得有点多余。可以直接对 dict 调用方法fromkeys
。
>>> dict.fromkeys(['name','age'])
{'age': None, 'name': None}
# 如果不想使用默认值None,可提供特定的值。
>>> dict.fromkeys(['name', 'age'], '(unknown)')
{'age': '(unknown)', 'name': '(unknown)'}
get
使用get来访问不存在的键,不会引发异常,而是返回None。可指定“默认”值,这样将返回指定的值而不是None。
>>> d = {'age': 42}
>>> d.get('name', 'N/A')
'N/A'
>>> d.get('age')
42
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')])
返回值属于一种名为字典视图的特殊类型。字典视图可用于迭代。另外可以确定其长度,对其执行成员资格检查。
>>> it = d.items()
>>> len(it)
3
>>> ('spam', 0) in it
True
视图的一个优点是不复制,他们始终是底层字典的反映,及时修改了底层字典亦是如此。
>>> d['spam'] = 1
>>> ('spam', 0) in it
False
>>> d['spam'] = 0
>>> ('spam', 0) in it
True
keys
返回一个字典视图,其中包含指定字典中的键。
pop
获取与指定键相关联的值,并将该键-值对从字典中删除。
>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>> d
{'y': 2}
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'}
setdefault
与get很像,获取与指定键相关联的值,但除此之外,还在字典不包含指定的键时,在字典中添加指定的键-值对, 如果没有指定,默认为None。
>>> d = {}
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name', 'N/A')
'Gumby'
>>> d
{'name': 'Gumby'}
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)
print(d)
# {'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2016','title': 'Python Language Website'}
对于通过参数提供的字典,将其项添加到当前字典中。如果当前字典包含键相同的项,则替换。
values
返回一个由字典中的值组成的字典视图。返回的视图可能包含重复的值。
>>> d = {1:1,2:2,3:1}
>>> d.values()
dict_values([1, 2, 1])