字典:如果想将值分组到一个结构中,并且通过编号对其进行引用,列表就能派上用场了。字典是一种通过名字引用值的数据结构,字典中的值并没有特殊的顺序,但是都是存储在一个特定的键(Key)里,键可以是数字、字符串或者元组。
创建和使用字典:
字典是由多个键及与其对应的值构成的对组成(键/值对称为项),每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来,空字典(不包括任何项)由两个大括号组成,字典中的键是唯一的,而值并不唯一
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'} #定义字典也可以通过dict函数来建立字典
>>> items=[('name','Gumby'),('age',42)]
>>> d=dict(items) #通过dict函数来建立映射关系
>>> d
{'age': 42, 'name': 'Gumby'}
>>> dd=dict(name='Clef',age=42) #通用是通过dict函数来建立映射关系的另一种表达
>>> dd
{'age': 42, 'name': 'Clef'}
基本的字典操作:
字典的基本行为在很多方面与序列(sequence)类似
len(d)返回d中项(键-值对)的数量
d[k]返回关联到键k上的值
d[k]=v将值v关联到键k上
del d[k]删除键为k的项
k in d检查d中是否有含有键为k的项
尽管字典和列表有很多特性相同,但也有下面一些重要的区别
键类型:字典的键不一定为整型数据,也可能是其他不可变类型,比如浮点数(实型)、字符串或者元组
自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项
成员资格:表达式k in d(d为字典)查找的是键,而不是值,表达式v in l(l为列表)则用来查找值,不是索引
>>> x=[] #x为空的列表
>>> x[2]='Testing' #试图给空列表的'2'号位置赋值,这显然是不可以的,因为这个位置根本就不存在
Traceback (most recent call last):
File "", line 1, in
IndexError: list assignment index out of range
>>> x={} #x为空的字典
>>> x[2]='Testing' #把'Testing'关联到空字典的键'2'号上,是没有问题的
>>> x
{2: 'Testing'}
字典的格式化字符串:
使用字符串作为键的字典,在每个转换说明符(conversion specifier)中的%字符后面,可以加上(用圆括号括起来的)键,后面再跟上其他说明元素,友情链接:字符串格式化
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> "Cecil's phone number is %(Cecil)s." % phonebook
"Cecil's phone number is 3258."
字典方法:
1. clear方法
清除字典中所有的项,这是个原地操作(类似于list.sort),所以无返回值(或者说返回None)
>>> x={}
>>> y=x #x,y对应同一个字典
>>> x['Key']='value'
>>> y
{'Key': 'value'}
>>> x={} #重新对字典x赋值为空,但是x清空了,但是y字典没有清空
>>> x
{}
>>> y
{'Key': 'value'}
>>> x={}
>>> y=x
>>> x['Key']='value'
>>> x.clear() #但是用clear方法就可以达到两者都清空的目的
>>> x
{}
>>> y
{}
2. copy方法
copy方法返回一个具有相同键-值对的新字典(这个方法实现的是浅复制(shallow copy),因为值本身就是相同的,而不是副本)
>>> x={'username':'admin','machine':['foo','bar','baz']}
>>> y=x.copy() #浅复制
>>> y['username']='mlh' #修改字典的某个值
>>> y['machine'].remove('bar') #删除字典的某个值
>>> x
{'username': 'admin', 'machine': ['foo', 'baz']} #修改的值对原字典没有影响,删除的值对原字典有影响
>>> y
{'username': 'mlh', 'machine': ['foo', 'baz']}避免上面浅复制带来的影响,可以用深复制(deep copy)
>>> from copy import deepcopy #导入deepcopy函数
>>> d={}
>>> d['names']=['Alfred','Bertrand']
>>> c=d.copy() #浅复制
>>> dc=deepcopy(d) #深复制
>>> d['names'].append('Clice') #修改原字典的内容
>>> c
{'names': ['Alfred', 'Bertrand', 'Clice']} #浅复制的新字典也随着修改了
>>> dc
{'names': ['Alfred', 'Bertrand']} #深复制的新字典没有改变
3. fromkeys方法
使用给定的键建立新的字典,每个键默认对应的值为None
>>> {}.fromkeys(['name','age'])
{'age': None, 'name': None}
>>> dict.fromkeys(['name','age']) #也可以用dict函数
{'age': None, 'name': None}
>>> dict.fromkeys(['name','age'],'(unknown)') #不用默认的None,自己通过默认值
{'age': '(unknown)', 'name': '(unknown)'}
4. get方法
访问字典项的方法
>>> d={}
>>> print d['name'] #打印字典里面没有的键会报错
Traceback (most recent call last):
File "", line 1, in
KeyError: 'name'
>>> print d.get('name') #用get方法就不会,打印None
None
>>> d.get('name','N/A') #取代默认的None,用N/A来替代
'N/A'
5. has_key方法
检查字典中是否含有给出的键,表达式d.has_key(k)相当于表达式k in d,注意Python 3.0中不包含这个函数
>>> d={}
>>> d.has_key('name')
False
>>> d['name']='Eric'
>>> d.has_key('name')
True
6. items方法和iteritems方法
items方法将所用的字典项以列表方法返回,这些列表项中的每一项都来自于(键、值),但是项在返回时并没有特殊的顺序
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook.items()
[('Beth', '9102'), ('Alice', '2341'), ('Cecil', '3258')]
>>> phonebook.iteritems() #iteritems方法作用大致和items相同,但是会返回一个迭代器对象而不是列表
>>> list(phonebook.iteritems())
[('Beth', '9102'), ('Alice', '2341'), ('Cecil', '3258')]
7. keys方法和iterkeys方法
keys方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook.keys()
['Beth', 'Alice', 'Cecil']
8. pop方法
用来获得对应于给定键的值,然后将这个键-值对从字典中移除
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook.pop('Alice') #移除键'Alice'以及对应的值
'2341'
>>> phonebook
{'Beth': '9102', 'Cecil': '3258'}
9. popitem方法
类似于list.pop,后者会弹出列表的最后一个元素,但是不同的是,popitem会弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook.popitem() #随机弹出一项
('Beth', '9102')
>>> phonebook
{'Alice': '2341', 'Cecil': '3258'}
10. setdefault方法
在某种程度上类似于get方法,就是能够获得于给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值
>>> d={}
>>> d.setdefault('name','N/A') #如果不设定值,默认是None
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name']='Gumby'
>>> d.setdefault('name','N/A') #当键为'name'的值不会空时,就不能设置了,返回对应的值
'Gumby'
>>> d
{'name': 'Gumby'}
11. update方法
利用一个字典项更新另外一个字典,如果没有相同的键,会添加到旧的字典里面
>>> phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> x={'Alice':'changed'}
>>> phonebook.update(x) #更新键'Alice'对应的值
>>> phonebook
{'Beth': '9102', 'Alice': 'changed', 'Cecil': '3258'}
>>> x={'Alicex':'changed'} #没有相同的键,直接添加到旧的字典里面
>>> phonebook.update(x)
>>> phonebook
{'Beth': '9102', 'Alice': 'changed', 'Alicex': 'changed', 'Cecil': '3258'}
12. values方法和itervalues方法
values方法以列表的形式返回字典中的值(itervalues返回值的迭代器),与返回键的列表不同的是,返回值的列表中包含重复的元素
>>> d={}
>>> d[1]=1
>>> d[2]=2
>>> d[3]=3
>>> d[4]=1
>>> d.values()
[1, 2, 3, 1]