<<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 = {'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_value
None

注意下面两种情形:

情形一:

>>> 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函数的技巧的脚本

[[email protected]]# 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)

输出结果:

[[email protected]]# ./phone.py
Enter name:Alice
Phone number(p) or address(a):p
Alice's phone number is 3102
[[email protected]]# ./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')
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)
     用(键/值)对(或者映射和关键字参数)建立字典

时间: 2024-08-24 10:36:00

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

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第13章 | 数据库支持

备注:这章内容相对介绍的比较简单,不过例子比较使用,主要是要掌握如果连接,使用数据库,并以SQLite做示例 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,现在已经通过了一个标准的DB API.目前的API版本(2.0)定义在PEP249中的Python Database API Specification v2.0中. 异常 为了尽可能准确地处理错误,API中定义了一些异常.它们被定义在一种层次结构中,所以可以通过一个except块捕捉多种异常. 连

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第05章 | 条件、循环和其他语句

第05章 | 条件.循环和其他语句 ------ print 和 import #如果要打印多个语句,用,分割 >>> print "Name is:","Sherry.","Age is:",40 Name is: Sherry. Age is: 40 >>> print (1,2,3) #如果要打印元祖 (1, 2, 3) >>> print 1,2,3 #print语句会在每个元素间插入

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第14章 | 网络编程

Python是个很强大的网络编程工具,原因有二: 1. Python内有很多针对常见网络协议的库 2. Python在处理字节流方面的优势 本章主要内容: 探讨Python标准库中的一些网络模块,探讨SocketServer类,最后是Twisted框架. ------ 相关模块 Socket模块 基本组件,用于两个程序之间的信息通道.套接字包括两个: 服务器套接字和客户端套接字.创建一个服务器套接字后,让它等待连接,这样它就在某个网络地址处监听.客户端套接字负责:简单的连接,完成事务,断开连接.

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

Python支持的工具包很多,但没有一个被认为标准的工具包,用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ 丰富的平台: Tkinter实际上类似于标准,因为它被用于大多数正式的Python GUI程序,而且它是Windows二进制发布版的一部分, 但是在UNIX上要自己编译安装. 另一个越来越受欢迎的工具是wxPython.这是个成熟而且特性丰富的包,也是Python之父,Guido van Rossu

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误: >>> f = open(r'D:\text.txt','r') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: 'D:\\

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第08章 | 异常

------ 什么是异常:Python用异常对象(exception object)来表示异常情况.如果异常信息未被处理或捕捉. 程序就会用回潄来终止执行 >>> 1/0 Traceback (most recent call last): #Traceback: 一种错误信息 File "<stdin>", line 1, in ? ZeroDivisionError: integer division or modulo by zero 每个异常都是一

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第07章 | 更加抽象

------ Python:面向对象的编程语言,多态,封装,继承三个主要特性 多态:来自希腊语,意味着有多种形式. >>> from random import choice >>> x = choice(['Hello,World!',[1,2,'e','e',4]]) >>> x.count('e') 1 任何不知道对象到底是什么类型,但又要对对象做的什么的时候,就要用到多态 >>> 1+2 3 >>> 'hot