1 字典

  字典是Python唯一内建的映射类型。字典是键值对的集合。

1.1 字典的使用

  某些情况下字典更加好用,比如一个电话列表。注意:电话号码只能用字符串数字表示,否则会出问题。因为电话号码一旦以0开头,就有可能被当做8进制解析,为了避免这个麻烦,就用字符串表示就可以了。用引号包住数字即可。

1.2 创建和使用字典

  字典可以通过下面的方式创建:
变量名 = {键名:值名,键名:值名....}
  注意:用引号包起来,键值对合在一起被称作项。键和值中间用冒号隔开,项之间用逗号隔开,所有的项用大括号包起来,叫做字典。空字典就是一对大括号{}.
例如
phonebook = {'Alice':'1234','Beth':'9102'}

1.2.1 dict函数

  可以用dict函数,通过其他映射比如字典或者(键,值)来建立字典

>>> items = [('name','Gumble'),('age',42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumble'}
>>> d['name']
'Gumble'

dict函数也可以通过关键字参数来创建字典

>>> d = dict(name = 'Gumble',age = 42)
>>> d
{'age': 42, 'name': 'Gumble'}

1.3  基本字典操作

  字典很多基本行为与序列类似,以字典d为例
1.len(d)返回d中项(键值对)的数量
2.d[k]返回关联到键k上的值
3.d[k] = v,修改d[k]索引的值
4.del d[k]删除键为k的项
5.k in d检查d中是否有含有键为k的项
  尽管字典和列表有很多特性相同,但也有一些区别,如下:
1.键值类型:字典的键值不一定为整型数据,也可能是其他不可变类型,如浮点型、字符串或元组,甚至是一个字典
2.自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个值,这样字典就会建立一个新的项,而列表在不适用append方法或者其他类似操作时,不能将值关联到列表范围之外的索引上。
3.成员资格:表达式k in d (d为字典)查找的键,而不是值,表达式v in l(l为列表)则用来查找值,而不是索引
在字典中检查键的成员资格比在列表中检查值的成员资格更高效,数据结构规模越大,两者效率差距越明显。
下面是一个存储号码的字典示例

'''
Created on 2013-8-3 @author: Landau
'''
#coding=utf-8
#简单数据库
#使用人名作为键的字典,phone表示电话,addr表示地址
people = {
'Alice':{
'phone':'',
'addr':'abcd'
},
'Bob':{
'phone':'',
'addr':'adfasf'
}
}
#针对电话号码用的描述性标签
labels = {
'phone':'phone number',
'addr':'address'
}
name = raw_input('Name: ')
request = raw_input('Phone number(p) or address(a)?')
#使用正确的键
if(request == 'p'):key = 'phone'
if(request == 'a'):key = 'address'
#如果名字是字典中有效的键,才会答应
if(name in people):print "%s's %s is %s" % (name,labels[key],people[name][key]) Name: Alice
Phone number(p) or address(a)?p
Alice's phone number is 1345

1.4 字典的格式化字符串

  我们已经见过如何使用字符串格式化功能来格式化元组中的所有值,如果使用(只以字符串作为键的)字典而不是元组来做这个工作,会使字符串格式化可读性更好。在每个转换说明符中的%字符后面,可以加上键,后面跟上其他说明元素

>>> "Alice's phone number is %(Alice)s" % phonebook
"Alice's phone number is 1234"

  当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以获得任意数量的转换说明符。这类字符串格式化在模板系统中非常有用。

template = '''<html>
<head><title>%(title)s</title></head>
<body>
<p>%(text)s</p>
</body>
</html> '''
data = {'title':'lOVE','text':'I love you'}
print template % data
输出:
<html>
<head><title>lOVE</title></head>
<body>
<p>I love you</p>
</body>
</html>

1.5 字典方法

  字典有很多有用的方法。
1.clear
  clear方法清除字典所有的项,这个方法是清除堆内存中的数据,是一种原地操作(针对指针指向的数据的)(类似于list.sort),返回值是None

>>> d = {}
>>> d
{}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print returned_value
None
>>>

2.copy

copy方法返回一个具有相同键值对的新字典(这个方法实现的是浅复制),并不是一个副本。

>>> x = {'username':'admin','machines':['for','bar','baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'
>>> y['machines'].remove('bar')
>>> y
{'username': 'mlh', 'machines': ['for', 'baz']}
>>> x
{'username': 'admin', 'machines': ['for', 'baz']}

可以看到,副本在替换值的时候,原始字典不受影响,但如果修改(原地修改,而不是替换)了某个值,原始字典也会改变。

避免这个问题方法是使用深复制,复制其包含所有值。使用copy模块的deepcopy函数

>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Jack','Alice']
>>> c = d.copy();
>>> dc = deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Jack', 'Alice', 'Clive']}
>>> dc
{'names': ['Jack', 'Alice']}

  从上面两个例子可以看出,浅复制只复制了某些值,而其他值处于共享状态,这样共享值被改变后,所有的都会改变,而深复制则复制了全部,相互之间的改变不受影响。

3.fromkeys
  fromkeys方法使用给定的键建立新的字典,每个键默认对应的值为None

>>> {}.fromkeys(['name','[age]'])
{'[age]': None, 'name': None}

  也可以直接在所有字典类型dict上调用方法

>>> dict.fromkeys(['name','[age]'])
{'[age]': None, 'name': None}

  如果不想使用None作为默认值,也可以自己提供默认值

{'[age]': '(unknown)', 'name': '(unknown)'}

4.get

get方法是个更宽松的访问字典项的方法,一般来说,如果试图访问字典中不存在的项时会出错。

>>> d = {}
>>> print d['name'] Traceback (most recent call last):
File "<pyshell#36>", line 1, in <module>
print d['name']
KeyError: 'name'

而用get方法就不会

>>> print d.get('name')
None

  可以看到,当使用get访问一个不存在的键时,没有任何异常,而得到了None值,还可以自定义默认值替换None

>>> print d.get('name','N/A')
N/A

  如果值存在,就可以像正常访问一样。

>>> d['name'] = 'Jack'
>>> d.get('name')
'Jack'

5.has_key

  has_key方法可以检查字典中是否含有给出的键。表达式d.has_key(k)相当于表达式k in d。使用哪个方式很大程度上取决于个人的洗好。Python3.0中不包括这个函数

>>> d = {}
>>> d.has_key('name')
False
>>> d['name'] = 'Jack'
>>> d.has_key('name')
True

6.items和iteritems

  items方法将所有的字典项以列表方式返回,这些列表项中的每一项都来自于(键,值)。但是项在返回时并没有特殊的顺序

>>> d = {'title':'Python Web Site','url':'http://www.python.org','spam':0}
>>> d.items()
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
>>> d.iteritems()
<dictionary-itemiterator object at 0x01BA1D20>
>>> it = d.iteritems()
>>> list(it)
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')

注意iteritems方法的作用大致相同,但是iteritems返回的是一个迭代器对象,而不是列表。通常情况下iteritems更高效

7.keys和iterkeys

  keys方法将字典的键以列表形式返回,而iterkeys则返回针对键的迭代器
8.pop

  pop方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除

>>> d.pop('spam')
0

9.popitem

  popitem方法类似于list.pop,后者会弹出列表的最后一个元素,但不同的是popitem弹出随机项,因为字典并没有最后的元素或者其他相关顺序的概念,若想一个接一个地移除这个方法就很有效。

10.setdefault

  setdefault方法在某种程度上类似于get方法,就是能够获得与给定键相关联的值,除此之外还可以在不给定键或值的情况下设定相应的键值

>>> d = {}
>>> d.setdefault('name','N/A')
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name','N/A')
'Gumby'
>>> d
{'name': 'Gumby'}

可以看到,当键不存在的时候,setdefault返回默认值,并且相应地更新字典,如果键存在,那么就返回与其对应的值,但不改变字典。默认值可选。

11.update

  update方法可以利用一个字典项更新另外一个字典,谁调用该方法,谁被更新

>>> d = {'Jack':'','Alice':''}
>>> x = {'Jack':''}
>>> d.update(x)
>>> d
{'Jack': '', 'Alice': ''}

  可以看到d的Jack键对应的值被更新了

12.values和itervalues

  values方法以列表形式返回字典的值(itervalues返回值列表的迭代器),与返回键的列表不同的是,键是唯一的,而返回值的列表中可以包含重复的元素

>>> d
{'Jack': '', 'Alice': ''}
>>> d.values()
['', '']
>>> list(d.itervalues())
['', '']

1.6 小结

映射:映射可以使用任何不可变对象标识元素,最常用的类型是字符串和元组,Python唯一内建的映射类型是字典
利用字典格式化字符串:可以通过在格式化说明符中包括名称(键)来对字典应用字符串格式化操作,当在字符格式化中使用元组时,还需对元组中每一个元素都设定格式化说明符。在使用字典时,所用的说明符可以比字典中用到的项少。
字典的方法:字典有很多方法,比如get、setdefault、keys等等

Python程序设计3——字典的更多相关文章

  1. Python题集:2019春Python程序设计选修课习题笔记

    一.判断题: 1-1.在Python 3.x中可以使用中文作为变量名. 答案:√ 1-2.Python变量使用前必须先声明,并且一旦声明就不能再当前作用域内改变其类型. 答案:× 1-3.Python ...

  2. python程序设计——基本语言特性

    参考<Python程序设计(第2版)> 清华大学出版社 董付国 ##### 除特殊说明外,以下代码示例,均为python 3.6版本 ##### 一.Python语言特性 1.python ...

  3. 20184302 2019-2020-2 《Python程序设计》实验四报告

    20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...

  4. python程序设计PDF高清完整版免费下载|百度云盘

    百度云盘:python程序设计PDF高清完整版免费下载 提取码:bvsz Python 程序设计基础难易程度适中.除Python应用开发基础知识之外,还适当介绍了Python标准库以及内置对象的工作原 ...

  5. Python列表,元组,字典,序列,引用

    1.列表 # Filename: using_list.py # This is my shopping list shoplist=["apple", "mango&q ...

  6. Python基础知识---字典

    现在在实习期间,好久没用Python了,今天在做Java项目时用的HashMap让我联想到了Python中的字典,就写一些Python字典的知识吧,复习复习. 字典:  key --> valu ...

  7. python基础之字典dict和集合set

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7043642.html python基础之字典dict和集合set 字典dic ...

  8. python中 字符 字典 列表之间的转换

    1 字典 转 字符 定义一个字典:dict = {'name': 'python', 'age': 7}字典转字符 可以使用str强制转换 如: str(dict) 此时dict的类型就是字符型了 2 ...

  9. python集合与字典的用法

    python集合与字典的用法 集合: 1.增加  add 2.删除   •del 删除集合 •discard(常用)删除集合中的元素  #删除一个不存在的元素不会报错 •remove 删除一个不存在的 ...

随机推荐

  1. 2017.11.28 Enginering management:problem-solving ability

    Today,my colleague is on bussiness trip. going to customer factory in jiangxi. slove the color diffe ...

  2. 线程存储(Thread Specific Data)

    线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了? 大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以使用它, ...

  3. Investment(完全背包)

    个人心得:炸了炸了,这背包什么的脑阔痛. 完全背包什么鬼咯,状态正向转移与01背包正好相反. 二维数组的状态转移. 一维数组的优化,注意正向覆盖. 本题中的思想 ;y<=year;y++){ ; ...

  4. unity3d___UGui中如何创建loading...进度条

    http://blog.sina.com.cn/s/blog_e82e8c390102wh2z.html 实现方法:通过Image组件中Image Type属性中Fill Amount,通过代码改变F ...

  5. CSS动画复习

    一.css动画相关的几个属性 属性 含义 理解 transform 一种CSS属性.用于修改CSS视觉格式模型的坐标空间.使用它,元素可以被移动(translate).旋转(rotate).缩放(sc ...

  6. Azure SLB + httpd + ILB + HAProxy + Atlas + MySQL

    为了测试一个环境,需要在Azure上搭建高可用的LAMP架构.但要求MySQL的中间件Atlas采用主备的模式.在数据中心一般采用Keepalive+VIP的模式,通过浮动地址对外提供服务. 但在云环 ...

  7. Web中的安全性问题

    根据2010年OWASP发布的Web应用程序安全风险主要是SQL注入攻击.跨网站脚本.伪造客户端请求.Cookie盗取,传输层保护不足. 1 SQL注入攻击  随着B/S框架结构在系统开发中的广泛应用 ...

  8. Java基础--序列化Serializable

    对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- package u ...

  9. ORACLE显式授权

    同一数据库 两个不同用户 user1 user2 user1里面有一张表 table1 在user2里面创建synonymcreate synonym sy1 for user1.table1; 创建 ...

  10. 机器学习:线性回归法(Linear Regression)

    # 注:使用线性回归算法的前提是,假设数据存在线性关系,如果最后求得的准确度R < 0,则说明很可能数据间不存在任何线性关系(也可能是算法中间出现错误),此时就要检查算法或者考虑使用其它算法: ...