<<Python基础教程>>学习笔记 | 第04章 | 字典

来源:互联网 发布:unity3d 自动寻路 编辑:程序博客网 时间:2024/05/16 12:46

第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.pypeople={'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" % phonebookWendy'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 = {'title':'My Home Page','text':'Welcome to my home page!'}>>> print template % data<html><head><title>My Home Page</title></head><body><h1>My Home Page</h1><p>Welcome to my home page!</p></body></html>
Note: String.Template 类对于此种情形也是非常有用的!

------

字典方法:
clear

>>> d={}>>> d['name']='Alice'>>> d['age'] = 30>>> d{'age': 30, 'name': 'Alice'}>>> return_value = d.clear()>>> d{}>>> return_valueNone
注意下面两种情形:
情形一:

>>> 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.pypeople={'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 = requestif 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.pyEnter name:AlicePhone number(p) or address(a):pAlice's phone number is 3102[root@host]# ./phone.pyEnter name:JerryPhone number(p) or address(a):papaJerry's papa is Not Available
可以看出,在get方法在程序中,即使是没有准备的值,也能做出合适的反应

------

has_key  类似于k in d,检查字典中是否有给定的键. 

>>> d={}>>> d.has_key('name')False>>> d['name']='John'>>> d.has_key('name')True
Note: Python 3.0中不包括此函数

------

itemsiteritems

>>> 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'}
------

valuesitervalues

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)      用(键/值)对(或者映射和关键字参数)建立字典

3 0
原创粉丝点击