首页 > 代码库 > <<Python基础教程>>学习笔记 | 第04章 | 字典
<<Python基础教程>>学习笔记 | 第04章 | 字典
第04章:字典 当索引不好用时
Python唯一的内建的映射类型,无序,但都存储在一个特定的键中,键可以使字符,数字,或者是元祖.
------
字典使用:
- 表征游戏棋盘的状态,每个键都是由坐标值组成的元祖
- 存储文件修改的次数,文件名作为键
- 数字电话/地址薄
- 函数传递值def func(x,*args,**args):
如果要建公司员工与座机号的列表,如果要获得Alice的座机只能这么找
>>> names = [‘Alice‘,‘Bob‘,‘Tom‘]
>>> numbers = [‘1234‘,‘7890‘,‘2356‘]
>>> numbers[names.index(‘Alice‘)]
‘1234‘
真正实用的是phonebook[‘Alice‘]=‘1234‘, 这里就用到字典
------
字典创建及使用
>>> phonebooks = {‘Alice‘:‘1234‘,‘Bob‘:‘7890‘,‘Tom‘:‘2356‘}
- Alice为键,‘1234‘为值
- 一对键/值为一项.
- 项与项之间用,分隔,键值之间用:分隔
- 键值唯一,值可以重复
- {} 空字典
dict函数:
可以通过dict函数,由其他键/值或其他字典来创建字典,比如下面: >>> items = [('name','Gumby'),('age',42)] >>> d1= dict(items) >>> d1 {'age': 42, 'name': 'Gumby'} >>> d1['name'] 'Gumby' 也可以通过关键字参数来创建字典,这是字典最有用的功能,在函数中很有用: >>> d = dict(name='Sherry',age=35) >>> d {'age': 35, 'name': 'Sherry'}------
基本字典操作:
>>> len(d) #求字典中项的个数,也就是键/值对的值
2
>>> d[‘name‘] #返回关联到键上的值
‘Sherry‘
>>> d[‘name‘]=‘Jerry‘ #将值关联到键上d[k]=v
>>> d
{‘age‘: 35, ‘name‘: ‘Jerry‘}
>>> del d[‘name‘] #删除键为值的项del d[k]
>>> d
{‘age‘: 35}
>>> ‘age‘ in d
True
字典与列表的一些重要区别:
- 字典中的键数据类型,可以使整型,否点型,字符型,或字典型
- 字典赋值,可以给空字典赋值,即超过索引外赋值,这点是列表不具备的
- k in d:查找的是键 v in l: 查找的是值(查找效率字典比列表高效,数据越多,效果越明显)
第一点:字典中的键可以为任何不可变的类型,这是字典最强大的功能,适用范围很广:
第二点:同样很重要,比如说,字典可以在空字典中建,列表就不行:
>>> x = [] >>> x[42]='Jerry' #将'Jerry'放到42号位置 Traceback (most recent call last): File "<pyshell#41>", line 1, in <module> x[42]='Jerry' IndexError: list assignment index out of range >>> x = {} >>> x[42]='Jerry' >>> x {42: 'Jerry'} 如果真要在42号关联'Jerry'值的话,必须用None来初始化,比如说: >>> x=[None]*43 >>> x[42]='Jerry' >>> x [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'Jerry']#电话本的脚本程序
#!/usr/bin/env python #Filename:phonebook.py people={ 'Alice':{'phone':'7890','addr':'street 7890'}, 'Jerry':{'phone':'1234','addr':'street 1234'}, 'Wendy':{'phone':'5678','addr':'street 5678'} } labels={ 'phone':'phone number', 'addr':'address' } name = raw_input('Enter 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])字典的格式化字符串:(键),如果键在字典中存在,那么就能打印出来,这一功能在模板系统中非常有用
>>> phonebook={'Alice':'6102','Jerry':'7438','Wendy':'8215'} >>> print "Wendy's phone number is %(Wendy)s" % phonebook Wendy's phone number is 8215 以HTML为例子 >>> template = '''<html> ... <head><title>%(title)s</title></head> ... <body> ... <h1>%(title)s</h1> ... <p>%(text)s</p> ... </body> ... </html> ... ''' >>> data = http://www.mamicode.com/{'title':'My Home Page','text':'Welcome to my home page!'}>Note: String.Template 类对于此种情形也是非常有用的!------
字典方法:
clear>>> d={} >>> d['name']='Alice' >>> d['age'] = 30 >>> d {'age': 30, 'name': 'Alice'} >>> return_value = http://www.mamicode.com/d.clear()>注意下面两种情形:
情形一:>>> x = {} >>> y = x >>> x['key'] = 'value' >>> y {'key': 'value'} >>> x {'key': 'value'} >>> x = {} >>> x {} >>> y {'key': 'value'}情形二:>>> x = {} >>> y = x >>> x['key'] = 'value' >>> x {'key': 'value'} >>> x;y {'key': 'value'} {'key': 'value'} >>> x.clear() >>> x;y {} {}如果想清空字典原始数据,就必须用clear()方法------
copy:
浅拷贝:copy返回键/值一样的数据,但不是副本
>>> x = {'user':'admin','machines':['host1','host2','host3']} >>> y = x.copy() >>> y {'user': 'admin', 'machines': ['host1', 'host2', 'host3']} >>> y['user']='root' >>> del y['machines'][2] >>> y {'user': 'root', 'machines': ['host1', 'host2']} >>> x {'user': 'admin', 'machines': ['host1', 'host2']}可以看出y只是修改的话,原始x不变,但如果删元素的话,x也会变化,如果要改变上述情况,就要用到深拷贝
深拷贝: 键/值一样,而且是副本>>> d = {} >>> d['name']=['Sherry','Jerry'] >>> c = d.copy() >>> dc= deepcopy(d) >>> d['name'].append('Alice') >>> c {'name': ['Sherry', 'Jerry', 'Alice']} >>> dc {'name': ['Sherry', 'Jerry']}fromkeys:使用给定的键建立新的字典
#方法一: >>> {}.fromkeys(['name','age']) {'age': None, 'name': None} #方法二:使用dict模块的fromkeys函数 >>> dict.fromkeys(['name','age']) {'age': None, 'name': None} #如果不想使用默认的None,可以自定义,比如说unknown >>> dict.fromkeys(['name','age'],'unknown') {'age': 'unknown', 'name': 'unknown'}get:更宽松的访问字典#一般的方法访问字典会报错 >>> d={} >>> print d['name'] Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: 'name' #如果用get的话,返回为空,这在程序中比较有用 >>> print d.get('name') None #还可以自定义返回的结果,比如说N/A.没查询到的话就会返回 >>> print d.get('name','N/A') N/A #如果有值的话,就能查询到 >>> d={'name':'Jerry'} >>> d.get('name') 'Jerry'#使用get函数的技巧的脚本[root@host]# cat phone.py #!/usr/bin/env python #Filename: phone.py people={ 'Alice':{'phone':'3102','addr':'Street 3102'}, 'Jerry':{'phone':'8125','addr':'Street 8125'}, 'Wendy':{'phone':'6501','addr':'Street 6501'} } #print的时候要用 labels={ 'phone':'phone number', 'addr' :'address' } name = raw_input('Enter name:') request = raw_input('Phone number(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 Available') print "%s's %s is %s" % (name,label,result)输出结果:[root@host]# ./phone.py Enter name:Alice Phone number(p) or address(a):p Alice's phone number is 3102 [root@host]# ./phone.py Enter name:Jerry Phone number(p) or address(a):papa Jerry's papa is Not Available可以看出,在get方法在程序中,即使是没有准备的值,也能做出合适的反应------
has_key 类似于k in d,检查字典中是否有给定的键.
>>> d={} >>> d.has_key('name') False >>> d['name']='John' >>> d.has_key('name') TrueNote: Python 3.0中不包括此函数------
items和iteritems
>>> d = {'title':'Python web page','url':'http://www.python.org','spam':0} >>> d.items() #返回一个无序列表 [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web page')] >>> d.iteritems() #返回的是一个迭代对象 <dictionary-itemiterator object at 0x2b1b153d4d80> >>> l= d.iteritems() #用list函数将迭代对象转为列表 >>> list(l) [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web page')]Note: iteritems函数效率更高些------
pop: 用来获得给定键的值,并且将其删除
>>> d = {'x':1,'y':2,'z':3} >>> d.pop() #注意不能为空,这个要个列表区别开来 Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: pop expected at least 1 arguments, got 0 >>> d.pop('x') 1 >>> d {'y': 2, 'z': 3}------popitem(): 弹出最后一项,这个类似于列表中的pop()方法,但因为字典是无序的。
若想一个个移除并处理项,这个方法就非常有用,因为不需要获取键的值
>>> d = {'title':'Python web page','url':'http://www.python.org','spam':0} >>> d.popitem() ('url', 'http://www.python.org') >>> d {'spam': 0, 'title': 'Python web page'}------setdefault:类似于get
>>> d = {} #如果空值的话,setdefault有效 >>> d.setdefault('name','N/A') 'N/A' >>> d {'name': 'N/A'} >>> d = {'name':'Jerry'} #如果本身有值的话,setdefault不生效 >>> d.setdefault('name','N/A') 'Jerry' >>> d {'name': 'Jerry'}------values和itervalues
values:以列表的方式返回字典中的值 itervalues:返回迭代的对象 >>> d={} >>> d[1]=1 >>> d[2]=2 >>> d[3]=3 >>> d[4]=4 >>> d.values() [1, 2, 3, 4] >>> d.itervalues() <dictionary-valueiterator object at 0x2ae67d732030> >>> l=d.itervalues() >>> list(l) [1, 2, 3, 4]------update:可以用一个字典去更新另一个字典
>>> d = { ... 'title':'Python Web Page', ... 'url':'http://www.python.org', ... 'changed':'Mar 14 22:09:05 GMT 2014' ... } >>> x = {'title':'Python Language Page'} >>> d.update(x) >>> d {'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:05 GMT 2014', 'title': 'Python Language Page'}------本章函数:
dict(seq) 用(键/值)对(或者映射和关键字参数)建立字典
<<Python基础教程>>学习笔记 | 第04章 | 字典