字典是python中的映射类型,是一种“键值对”(key-value)数据结构。
key是任意不可变的类型对象,通常是字符串和数字,不能是list(list可以改变)。
value可以是任何类型的数据。
字典可以通过dict()和一对花括号创建一个空字典(d={}),花括号内键值对用(:)隔开,多个键值对之间用(,)隔开。
创建空字典:
>>> d = {} >>> d {} >>> d1 = dict() >>> d1 {} >>> d1 == d True
可以通过传入参数进行初始化。
传入参数有两种形式:一种是,序列型数据list或tuple,它每个元素必须又含有两个子元素,以满足key-value对;一种是,name=value形式的参数。
>>> d = {'a':1,'b':2,'c':3} >>> d {'a': 1, 'b': 2, 'c': 3} >>> d1 = dict(a=1,b=2,c=3) #name=value形式的参数 >>> d1 {'a': 1, 'b': 2, 'c': 3} >>> d2 = dict([('a',1),('b',2)]) >>> d2 {'a': 1, 'b': 2}
用for循环创建一个字典:
>>> dd = {x:x+x for x in range(5)} >>> dd {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
list可以做value,但不能做key
>>> d = {'a':[1,2,3]} >>> d {'a': [1, 2, 3]} >>> d1 = {[1,2,3],'a'} Traceback (most recent call last): File "<pyshell#25>", line 1, in <module> d1 = {[1,2,3],'a'} TypeError: unhashable type: 'list'
字典通过键访问值,有2种方式:
>>> d = dict(a=1,b=2,c=3) >>> d {'a': 1, 'b': 2, 'c': 3} >>> d['b'] #通过‘b’访问到值 2 >>> d.get('a') #通过get(key)方法访问值 1 >>> d['c']=5 >>> d {'a': 1, 'b': 2, 'c': 5}
字典的变更
>>> d = dict(a=1,b=2,c=3) >>> d {'a': 1, 'b': 2, 'c': 3} >>> d['b']=5 #修改某个键的值 >>> d {'a': 1, 'b': 5, 'c': 3} >>> d['d']=7 #新增一个键值对 >>> d {'a': 1, 'b': 5, 'c': 3, 'd': 7} >>> del d['a'] #删除某个键值对 >>> d {'b': 5, 'c': 3, 'd': 7}
sorted()把字典的所有key当做一个列表(或元组)进行排序
>>> d = dict(a=1,b=2,c=3,d=4) >>> d {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> sorted(d) ['a', 'b', 'c', 'd']
遍历key:
>>> for key in d: print(key) a b c d
clear()可以清空一个字典:
fromkeys()通过一个序列来初始化字典:
>>> d={} >>> d.fromkeys([1,2,3]) {1: None, 2: None, 3: None} >>> d.fromkeys([1,2,3],1) {1: 1, 2: 1, 3: 1}
update()用一个字典来更新另一字典:
>>> x = d.fromkeys([1,2,3]) >>> x {1: None, 2: None, 3: None} >>> x.update({1:'a',2:'b'}) >>> x {1: 'a', 2: 'b', 3: None}
将字符串格式设置功能用于字典——format_map
>>> template = '''<html> <head><title>{title}</title></head> <body> <h1>{title}</h1> <p>{text}</p> </body>''' >>> data = {'title':'My Home Page','text':'Welcom to my home page'} >>> print(template.format_map(data)) <html> <head><title>My Home Page</title></head> <body> <h1>My Home Page</h1> <p>Welcom to my home page</p> </body>
copy方法返回一个新字典,这个方法执行的是浅复制,因为值本身就是原件。
>>> x = {'username':'admin','abc':['foo','bar','baz']} >>> y = x.copy() >>> y {'username': 'admin', 'abc': ['foo', 'bar', 'baz']} >>> y['abc'].remove('bar') >>> y['username']='admin123' >>> y {'username': 'admin123', 'abc': ['foo', 'baz']} >>> x {'username': 'admin', 'abc': ['foo', 'baz']}
浅复制,当替换副本中的值时,原件不受影响(‘username’对应的值)。但是修改副本中的值,原件也将发生变化(‘abc’列表变化)。
为避免上面的情况,可以执行深复制。即同时复制值及其包含的所有值。
>>> from copy import deepcopy >>> d = {} >>> d['names'] = ['alfred','bertrand'] >>> c = d.copy() >>> e = deepcopy(d) >>> d['names'].append('clive') >>> c {'names': ['alfred', 'bertrand', 'clive']} >>> e {'names': ['alfred', 'bertrand']}