字典(python唯一内建的映射类型)1.创建和使用字典>>> phonebook = {'liu':'0234','feng':'043254'}>>> phonebook{'liu': '0234', 'feng': '043254'}键值唯一,值可重复dict函数(不是真正的函数,是个类型,像list、tuple、str)映射>>> items = [('name','test'),('age',10)]>>> items[('name', 'test'), ('age', 10)]>>> d = dict(items)>>> d{'age': 10, 'name': 'test'}关键字>>> d = dict(name='test',age=20)>>> d{'age': 20, 'name': 'test'}基本字典操作len(d) 返回d中项数量d[k] 返回关联到键k上的值d[k]=v 将值v关联到键k上del d[k] 删除键为k的项k in d 检查d中是否有含有键为k的项字典和列表的区别键类型:字典的键不一定为整型数据,浮点型、字符串或者元组自动添加:即时键起初在字典中并不存在,也可分配一个值成员资格:k in d(字典),查找的是键不是值 v in l(列表),查找值而不是索引示例[python]people = { 'alice':{ 'phone':'06543', 'addr':'hefei' }, 'benly':{ 'phone':'0123', 'addr':'sc' }, }labels = { 'phone':'phone number', 'addr':'address'}name = raw_input('Name:')request = raw_input('phone numbel (p) or address (a)?')if request == 'p': key = 'phone'if request == 'a': key = 'addr'if name in people: print "%s %s is %s." % (name, labels[key], people[name][key])else: print "no have this people." [/python]字典的格式化字符串>>> phonebook = {'liu':'0234','feng':'043254'}>>> "liu's phone number is %(liu)s." % phonebook"liu's phone number is 0234."字典方法clear方法清除字典中所有的项,这个是原地操作(类似于list.sort),所以无返回值(或者说返回None)>>> phonebook{'liu': '0234', 'feng': '043254'}>>> returned = phonebook.clear()>>> phonebook{}>>> print returnedNone为什么用这个方法,考虑两种情况第一种>>> x = {}>>> y = x>>> x['key'] = 'value'>>> y{'key': 'value'}>>> x = {}>>> y{'key': 'value'}第二种>>> x = {}>>> y = x>>> x['key'] = 'value'>>> y{'key': 'value'}>>> x.clear()>>> y{}想清空原始字典中所有的元素,必须使用clear方法copy浅复制>>> x = {'username':'admin', 'like':['read','music','code']}>>> y = x.copy()>>> y['username'] = 'test'>>> y['like'].remove('read')>>> y{'username': 'test', 'like': ['music', 'code']}>>> x{'username': 'admin', 'like': ['music', 'code']}可以看出副本中替换值的时候,原始字典不受影响,如果修改了某个值,原始字典也会变动为了避免这个问题,使用深复制深复制>>> from copy import deepcopy>>> d = {}>>> d['names'] = ['test1','test2']>>> c = d.copy()>>> dc = deepcopy(d)>>> d['names'].append('test3')>>> c{'names': ['test1', 'test2', 'test3']}>>> dc{'names': ['test1', 'test2']}fromkeys使用给定的键建立新的字典,每个键默认对应的值为None>>> {}.fromkeys(['name','age']){'age': None, 'name': None}>>> dict.fromkeys(['name','age']){'age': None, 'name': None}也可以指定默认值>>> dict.fromkeys(['name','age'],'unknown'){'age': 'unknown', 'name': 'unknown'}get一般来说,试图访问字典中不存在的项时会出错,get不会>>> d = {}>>> print d['ddd']Traceback (most recent call last):File "", line 1, in print d['ddd']KeyError: 'ddd'>>> print d.get('name')None>>> d.get('name','N/A')'N/A'示例[python]people = { 'alice':{ 'phone':'06543', 'addr':'hefei' }, 'benly':{ 'phone':'0123', 'addr':'sc' }, }labels = { 'phone':'phone number', 'addr':'address'}name = raw_input('Name:')request = raw_input('phone numbel (p) or address (a)?')key = requestif request == 'p': key = 'phone'if request == 'a': key = 'addr'person = people.get(name,{})label = labels.get(key,key)result = person.get(key,'not valid')print "%s %s is %s." % (name, label, result)[/python]has_key(python3.0中不包括这个函数)想当于k in d>>> d = {}>>> d.has_key('name')False>>> d{}>>> d['name'] = 'eric'>>> d.has_key('name')True>>> 'name' in dTrueitems和iteritemsitems方法将所有的字典项以列表方式返回>>> d = {'title':'python web site','url':'www.python.org'}>>> d{'url': 'www.python.org', 'title': 'python web site'}>>> d.items()[('url', 'www.python.org'), ('title', 'python web site')]iteritems作用大致相同,但是会返回一个迭代器对象而不是列表(很多情况下使用iteritems更高效)>>> d.iteritems()>>> it = d.iteritems()>>> it>>> list(it)[('url', 'www.python.org'), ('title', 'python web site')]keys和iterkeyskeys方法将字典中的键以列表形式返回,iterkeys返回针对键的迭代器>>> d{'url': 'www.python.org', 'title': 'python web site'}>>> d.keys()['url', 'title']>>> d{'url': 'www.python.org', 'title': 'python web site'}>>> it = d.iterkeys()>>> list(it)['url', 'title']pop获得对应给定键的值,然后将这个键-值从字典中移除>>> d = {'x':1, 'y':2}>>> d{'y': 2, 'x': 1}>>> d.pop('x')1>>> d{'y': 2}popitem类似于list.pop,后者会弹出列表的最后一个元素,而popitem弹出随机的项>>> d{'y': 2, 'x': 1}>>> d.popitem()('y', 2)>>> d{'x': 1}popitem和列表的pop方法很类似,但字典中没有和append等价的方法,因为字典是无序的setdefault某种程度上类似于get方法,还能在字典中不含有给定键的情况下设定相应的键值>>> d{'y': 2, 'x': 1}>>> d.setdefault('x')1>>> d.setdefault('z','123')'123'>>> d{'y': 2, 'x': 1, 'z': '123'}>>> d.setdefault('i')>>> d{'y': 2, 'x': 1, 'z': '123', 'i': None}update利用一个字典项更新另外一个字典>>> d = {'x':1,'y':2}>>> d{'y': 2, 'x': 1}>>> u = {'x':3}>>> d.update(u)>>> d{'y': 2, 'x': 3}values和itervaluesvalues以列表的形式返回字典中的值,itervalues返回值的迭代器,与返回键的列表不同的是,返回值的列表可以包含重复的值>>> d{'y': 2, 'x': 3}>>> d.values()[2, 3]