python学习笔记5——第四章 字典
第四章? 字典
?
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) #长度>>> a2>>> 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: AlicePhone number (p) or address (a)? aAlice'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不存在,则用空字典表示该personlabel = labels.get(key, key) #若用户输入的不是p或a,则将输入内容作为labelresult = person.get(key, 'not available') #若key(即用户输入不存在),则输出notavailableprint "%s's %s is %s." %(name, label, result)#运行结果>>> Name: sunPhone number (p) or address (a)? asun's address is not available.>>> ================================ RESTART ================================>>> Name: AlicePhone number (p) or address (a)? pAlice's phone number is 2341.>>> ================================ RESTART ================================>>> Name: AlicePhone number (p) or address (a)? testAlice'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') #不存在该键,返回默认值NoneNone>>> 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