Python——字典
字典是python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里。键可以是数字、字符串甚至是元组。
一、创建和使用字典
字典可以通过下面的方式创建:
>>> phonebook = {'alice' : '2341', 'beth' : '9102', 'cecil' : '3258'}字典由多个键及与其对应的值构成的对组成。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。字典中的键是唯一的,而值并不唯一。
1. dict 函数
用 dict 函数,通过其他映射(比如其他字典)或者(键,值)这样的序列对建立字典。
>>> items = [('name', 'gumby'), ('age', 42)] >>> d = dict(items) >>> d {'name': 'gumby', 'age': 42}dict 函数也可以通过关键字参数来创建字典。
>>> d = dict(name='gumby', age=42) >>> d {'name': 'gumby', 'age': 42}2. 基本字典操作
字典的基本行为在很多方面与序列类似:
(1)len(d) 返回 d 中项(键-值对)的数量
(2)d[k] 返回关联到键 k 上的值
(3)d[k] = v 将值 v 关联到键 k 上
(4)del d[k] 删除键为 k 的项
(5)k in d 检查 d 中是否有含有键为 k 的项
尽管字典和列表有很多特性相同,但也有下面一些重要的区别。
(1)键类型:字典的键不一定为整型数据(但也可能是),也可能是其他不可变类型,比如浮点型(实型)、字符串或者元组。
(2)自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。
(3)成员资格:表达式 k in d (d 为字典) 查找的是键,而不是值。
3. 字典的格式化字符串
在每个转换(conversion specifier)中的 % 字符后面,可以加上用圆括号括起来的键,后面再跟上其他说明元素。
>>> phonebook {'alice': '2341', 'beth': '9102', 'cecil': '3258'} >>> "cecil's phone number is %(cecil)s." % phonebook "cecil's phone number is 3258."只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符。
>>> template = ''' ... %(title)s ... ... %(title)s ...4. 字典方法%(text)s
... ''' >>> data = {'title':'my home page', 'text':'welcome to my home page!'} >>> print(template % data) my home page my home pagewelcome to my home page!
(1) clear
clear 方法清除字典中所有的项。这是个原地操作,所以无返回值(或者说返回 none)。
>>> d {'name': 'gumby', 'age': 42} >>> retured_value = d.clear() >>> d {} >>> retured_value >>> print(retured_value) none
(2) copy
copy 方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallow 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']}上面,当在 y 中替换值的时候,x 不受影响,但是,如果修改了某个值(原地修改,而不是替换),x 也会改变,因为同样的值也存储在原字典中。
避免这个问题的一种方法就是使用深复制( deep copy),复制其包含所有的值。可以使用 copy 模块的 deepcopy 函数来完成操作。
(3)fromkeys
fromkeys 方法使用给定的键建立新的字典,每个键默认对应的值为 none。
>>> {}.fromkeys(['name', 'age']) {'name': none, 'age': none}也可以直接在所有字典的类型 dict 上面调用方法。
>>> dict.fromkeys(['name', 'age']) {'name': none, 'age': none}如果不想使用none作为默认值,也可以自己提供默认值。
>>> dict.fromkeys(['name', 'age'], '(unknown)') {'name': '(unknown)', 'age': '(unknown)'}
(4)get
当使用 get 访问一个不存在的键时,没有任何异常,而得到了 none 值。
>>> print(d['name']) traceback (most recent call last): file "", line 1, in keyerror: 'name' >>> print(d.get('name')) none还可以定义“默认”值,替换 none:
>>> d.get('name', 'n/a') 'n/a'如果键存在,get用起来就像普通的字典查询一样。
(5)items
items 方法将所有的字典项以dict_items 方式返回,这些列表项中的每一项都来自于(键,值)。
>>> d = {'title':'python web site', 'url':'https://www.python.org', 'spam':0} >>> d {'url': 'https://www.python.org', 'title': 'python web site', 'spam': 0} >>> d.items() dict_items([('url', 'https://www.python.org'), ('title', 'python web site'), ('spam', 0)])
(6)keys
keys 方法将字典中的键以 dict_keys 形式返回。
(7)pop
pop 方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除。
>>> d = {'x':1, 'y':2} >>> d.pop('x') 1 >>> d {'y': 2}
(8)popitem
popitem 弹出随机的项。
>>> d {'url': 'https://www.python.org', 'title': 'python web site', 'spam': 0} >>> d.popitem() ('url', 'https://www.python.org') >>> d {'title': 'python web site', 'spam': 0}
(9)setdefault
setdefault 方法在某种程度上类似于 get 方法,就是能够获得与给定键相关联的值,除此之外,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'}当键不存在的时候,setdefault 返回默认值并且相应地更新字典。如果键存在,那么就返回与其相应的值,但不改变字典。
(10)update
update 方法可以利用一个字典项更新另一个字典。
>>> d = {'title':'python web site', 'url':'https://www.python.org', 'changed':'mar 14 22:09:15 met 2008'} >>> x = {'title':'python language website'} >>> d.update(x) >>> d {'url': 'https://www.python.org', 'title': 'python language website', 'changed':'mar 14 22:09:15 met 2008'}提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
(11)values
values 方法以 dict_values 的形式返回字典中的值。
>>> d = {} >>> d[1] = 1 >>> d[2] = 2 >>> d[3] = 3 >>> d[4] = 4 >>> d.values() dict_values([1, 2, 3, 4])