第四章 字典
1. 映射mapping——通过名字引用值的数据结构,字典是唯一内建的映射类型。可以使用任何不可变的对象标识元素,常用字符串和元组。
key——value,可以是字符串、元组、数字
创建字典
>>>直接创建 >>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'} >>>使用dict()函数创建 >>> items = [('name', 'Gumby'), ('age', 42)] #1 >>> d = dict(items) >>> d {'age': 42, 'name': 'Gumby'} >>> >>> d = dict(name='Gumby', age=42) #2 >>> d {'age': 42, 'name': 'Gumby'} >>> >>> dict() #空字典 {}
2. 字典操作
>>> d = {'age': 42, 'name': 'Gumby'} >>> a = len(d) #长度 >>> a 2 >>> d['age'] #d[k]返回关联到键k上的值 42 >>> d['no'] = '123' #d[k]=v,将值v关联到键k上 自动添加 >>> d {'age': 42, 'name': 'Gumby', 'no': '123'} >>> del d['no'] #del d[k] 删除键为k的项 >>> d {'age': 42, 'name': 'Gumby'} >>> 'age' in d # k in d检查d中是否含有键为k的项, 注意是 键 # 在字典中检查键的成员资格,比在列表中检查值的成员资格效率高 True >>> x = [] #空列表 >>> x[42] = 'Foobar' #将值关联到一个并不存在的索引,报错,需要[None] * 43, x[42]='Foobar'才可 Traceback (most recent call last): File "<pyshell#125>", line 1, in <module> x[42] = 'Foobar' #将值关联到一个并不存在的索引,报错 IndexError: list assignment index out of range >>> x = {} #空字典 >>> x[42] = 'Foobar' #可以直接自动添加关联 >>> x {42: 'Foobar'}
完整示例
#简单数据库 #使用人名作为键的字典,每个人使用另一个字典来表示,其键'phone'和'addr'分别表示电话号码和地址 people = { 'Alice':{ 'phone': '2341', 'addr': 'Foo drive 23' }, 'Beth':{ 'phone': '9102', 'addr': 'Bar street 42' }, 'Cecil':{ 'phone': '3158', 'addr': 'Baz avenue 90' } } #针对电话号码和地址使用的描述性标签,在输出时用到 labels = { 'phone': 'phone number', 'addr': 'address' } name = raw_input('Name: ') #查找电话号码还是地址,使用正确的按键 request = raw_input("Phone number (p) or address (a)? ") if request == 'p': key = 'phone' if request == 'a': key = 'addr' #如果名字是字典中的有效键才打印信息 if name in people: print "%s's %s is %s." %(name, labels[key], people[name][key]) #运行结果 Name: Alice Phone number (p) or address (a)? a Alice's address is Foo drive 23.
3. 使用字典格式化字符串
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'} >>> "Ceil's phone number is %(Ceil)s." %phonebook #使用字典格式化的方法 "Ceil's phone number is 0123." #例子 >>> template = '''<html> <head><title>%(title)s</title></head> <body> <h1>%(title)s</h1> <p>%(text)s</p> </body> </html>''' >>> data = {'title': 'My Home Page', 'text': 'Welcome to my homepage!'} >>> print template %data <html> <head><title>My Home Page</title></head> <body> <h1>My Home Page</h1> <p>Welcome to my homepage!</p> </body> </html>
4. 字典方法
#(1) >>> #clear()请空字典,无返回值或返回值为None >>> #例1不使用clear() >>> x = {} >>> y = x #x,y指向同一字典 >>> x['key'] = 'value' #自动添加 >>> y {'key': 'value'} >>> x = {} #x指向另一新的字典,而原字典不变,y仍指向原来的字典 >>> y {'key': 'value'} >>> #例2使用clear() >>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key': 'value'} >>> x.clear() #使用clear()清空了原始字典 >>> y {} #(2) >>> #copy()浅复制,在副本中替换值时原始字典受影响,而修改受 >>> x = {'a': '1', 'b': ['2','3']} >>> y = x.copy() >>> y['a'] = '11' #替换 >>> y['b'].remove('2') #修改 >>> y {'a': '11', 'b': ['3']} #副本值替换,修改 >>> x {'a': '1', 'b': ['3']} #原始字典只修改,不替换 #(3)深复制 >>> #copy模块中的deepcopy() >>> from copy import deepcopy >>> d = {} >>> d['names'] = ['Alfred', 'Bertrand'] #原始字典 >>> d {'names': ['Alfred', 'Bertrand']} >>> c = d.copy(); #浅复制 >>> dc = deepcopy(d) #深复制 >>> d['names'].append('Clive') #对原字典修改 >>> c {'names': ['Alfred', 'Bertrand', 'Clive']} #浅复制也修改了 >>> dc {'names': ['Alfred', 'Bertrand']} #深复制未被修改 #(4)fromkeys >>> #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'} #(5)get >>> #通常使用不存在键访问时,会报错,但使用get方法,可以不报错 >>> d = {} >>> print d['name'] Traceback (most recent call last): File "<pyshell#213>", line 1, in <module> print d['name'] KeyError: 'name' >>> #使用get不会报错 >>> print d.get('name') None >>> #更改默认值 >>> d.get('name', 'N/A') 'N/A' >>> #如果键存在,get用起来就像普通的字典查询 >>> d['name'] = 'Eric' >>> d.get('name') 'Eric'
使用get()的完整示例
# 使用get()的简单数据库 people = { 'Alice':{ 'phone': '2341', 'addr': 'Foo drive 23' }, 'Beth':{ 'phone': '9102', 'addr': 'Bar street 42' }, 'Cecil':{ 'phone': '3158', 'addr': 'Baz avenue 90' } } #针对电话号码和地址使用的描述性标签,在输出时用到 labels = { 'phone': 'phone number', 'addr': 'address' } name = raw_input('Name: ') #查找电话号码还是地址,使用正确的按键 request = raw_input("Phone number (p) or address (a)? ") key = request #新加内容,请求既不是'p'也不是'a' if request == 'p': key = 'phone' if request == 'a': key = 'addr' #使用get()提供默认值 person = people.get(name, {}) #若输入的name不存在,则用空字典表示该person label = labels.get(key, key) #若用户输入的不是p或a,则将输入内容作为label result = person.get(key, 'not available') #若key(即用户输入不存在),则输出notavailable print "%s's %s is %s." %(name, label, result) #运行结果 >>> Name: sun Phone number (p) or address (a)? a sun's address is not available. >>> ================================ RESTART ================================ >>> Name: Alice Phone number (p) or address (a)? p Alice's phone number is 2341. >>> ================================ RESTART ================================ >>> Name: Alice Phone number (p) or address (a)? test Alice's test is not available.
方法续
#(1)items >>> #items将字典以列表形式返回 >>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'} >>> phonebook.items() [('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')] #(2)iteritems >>> #iteritems将字典以迭代器形式返回 >>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'} >>> it = phonebook.iteritems() >>> it <dictionary-itemiterator object at 0x01F145C0> >>> list(it) #将literator(迭代器)转为list [('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')] #(3)pop() >>> #pop()根据键获得值并弹出,并从字典中删除键-值 >>> d = {'x':1, 'y':2} >>> d.pop('x') 1 #根据键'x'查找值1,并弹出1 >>> d #删除x--1之后的字典 {'y': 2} >>> #(4)popitem() >>> #popitem()随机弹出某项键-值 >>> d = {'1': 'a', '2': 'b', '3': 'c'} >>> d.popitem() #随机弹出1---a ('1', 'a') >>> d #删除了1---a {'3': 'c', '2': 'b'} >>> #(5)setdefault() 类似get方法 >>> #setdefault()类似get(),根据键获取值,若无键则返回默认值None,默认值可重设 >>> d = {} >>> print d.setdefault('name') #不存在该键,返回默认值None None >>> d.setdefault('name', 'N/A') 'N/A' >>> d['name'] = 'Gumby' >>> d.setdefault('name') 'Gumby' #(6)update() >>> #update()若键不存在则添加,存在则覆盖 >>> d = {'1': 'a', '2': 'b', '3': 'c'} >>> x = {'3': 'cdef'} >>> d.update(x) #键‘3’存在,更改‘3’对应的值 >>> d {'1': 'a', '3': 'cdef', '2': 'b'} >>> y = {'4': 'test'} #键‘4’不存在,添加该键值对 >>> d.update(y) >>> d {'1': 'a', '3': 'cdef', '2': 'b', '4': 'test'} #(7)values() >>> #values()以列表形式返回字典中的值,此列表可包含重复值 >>> d = {} >>> d[1] = 1 >>> d[2] = 2 >>> d[3] = 3 >>> d {1: 1, 2: 2, 3: 3} >>> d.values() [1, 2, 3]
总结:
dict