字典(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 returned None 为什么用这个方法,考虑两种情况 第一种 >>> 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 " <pyshell#99>", 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 = request if 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 d True items和iteritems items方法将所有的字典项以列表方式返回 >>> 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和iterkeys keys方法将字典中的键以列表形式返回,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和itervalues values以列表的形式返回字典中的值,itervalues返回值的迭代器,与返回键的列表不同的是,返回值的列表可以包含重复的值 >>> d {'y': 2, 'x': 3} >>> d.values() [2, 3]