<<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'
也能够通过keyword參数来创建字典,这是字典最实用的功能。在函数中非常实用:
>>> 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函数的技巧的脚本
[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')
True
Note: 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)
用(键/值)对(或者映射和keyword參数)建立字典
<<Python基础教程>>学习笔记 | 第04章 | 字典的更多相关文章
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...
- <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
- 《Python基础教程(第二版)》学习笔记 -> 第四章 字典
字典是Python中唯一内建的映射类型. 字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)里.键可以是数字.字符串甚至是元组. 字典的使用 某些情况下,字典比列表更加适用: 表征游戏棋盘 ...
- Python基础教程(第3版) 笔记(三)
1.9.1让脚本像普通程序一样在UNIX中运行脚本,只需将下面的代码作为脚本的第一行, 就可在UNIX中轻松运行脚本: #!/usr/bin/env python 要像普通程序一样运行脚本,还必须将其 ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
- Python基础教程(第3版) 笔记(一)
1.1 数和表达式: 除法运算的结果为小数,即浮点数 >>>1/2 0.5 除法运算为整数,使用双斜杠 >>>1//2 0 >>>5.0//2.4 ...
- Python基础教程思维导图笔记
说明:直接查看图片可能不太清楚,用浏览器打开后,按住 Ctrl ,网上滚动鼠标放大浏览器页面,可以看清楚图片
随机推荐
- 【Luogu】P2468粟粟的书架(主席树+前缀和)
题目链接 我仿佛中了个爆零debuff 本题分成两部分,五十分用前缀和,f[i][j][k]表示(1,1)到(i,j)的矩形大于等于k的有多少个数(再记录页数和),查询时二分,另外的用主席树,类似方法 ...
- C/C++注释规范
C/C++注释规范 Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C.C++.Java.Objective-C和IDL语言,部分支持PHP.C#.鉴于Doxygen ...
- 爱之箭发射(las)
爱之箭发射(las) 目描述 小海是弓道部的成员,非常擅长射箭(Love Arrow Shoot).今天弓道部的练习是要射一棵树.一棵树是一个nn个点n−1n−1条边的无向图,且这棵树的第ii个点有一 ...
- js本地对象的操作
1 String对象方法: concat 将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world" ...
- 开发人员为组件添加自定义的className
在开发过程当中需要给组件写上自己的样式,这个时候怎么办呢? 直接给组件添加className这样是无效的 当给组件添加className之后 在写组件的时候需要对使用你的组件的开发人员提供自定义cla ...
- 事务的四大属性ACID即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability.。
事务的四大属性ACID即事务的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability.. 原子性(Atomicity) 原子性是指事 ...
- SqlServer不允许更改字段类型(表中已有数据)
工具-选项-设计器-阻止保存要求重新创建表的更改,√去掉.
- 【虚拟机】主机与VMware虚拟机通信(XP版)(转)
一.与主机共享ADSL链接/无线网络(虚拟机内可上网) 安装虚拟机后,在网络链接下除了本地链接外,会出现两个新的链接,分别是VMware Network Adapter VMnet1和VMware N ...
- GDB 命令详细解释
Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工具一样,gdb提供了以 ...
- IPC最快的方式----共享内存(shared memory)
在linux进程间通信的方式中,共享内存是一种最快的IPC方式.因此,共享内存用于实现进程间大量的数据传输,共享内存的话,会在内存中单独开辟一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限 ...