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. python并发编程的几种方法

    1.多线程 Threading模块 2.2.6版本以后 多进程 multiprocessing模块 3.协程 gevent (是一个基于libev的并发库.它为各种并发和网络相关的任务提供了整洁的AP ...

  2. scrapy入门实践1

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 这就是整个Scrapy的架构图了: 各部件职能: Scrapy ...

  3. RabbitMQ和Kafka可靠性

    RabbitMQ和Kafka可靠性 https://www.cnblogs.com/haolujun/p/9641840.html 我们通过前文知道,RabbitMQ的队列分为master queue ...

  4. 利用MsChart控件绘制多曲线图表

    在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,发现MsC ...

  5. 【转】JVM虚拟性能分析

    JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...

  6. 全球知名的HTTPS网站检测工具-Qualys SSL Labs

    推荐一个在线版全球知名的HTTPS网站检测工具-Qualys SSL Labs.Qualys SSL Labs同时也是很具有影响力的SSL安全和性能研究机构. SSL Labs会对HTTPS网站的证书 ...

  7. Annotation之四:注解中的-Xlint:unchecked和 -Xlint:deprecation

    一.-Xlint:unchecked用法 对如下Test.java编译时 package com.dxz.annotation; import java.util.ArrayList; import ...

  8. cassandra安装配置

    准备运行环境1.1 cassandra可以安装在windows和linux下,本例子安装在centos6.7的环境下.1.2 关闭防火墙.或者开放9042(默认的CQL本地服务端口).9160(默认的 ...

  9. 分布式代码管理github

    Git是世界上最先进的分布式版本的控制系统,特点是:简单大气上档次. Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了.

  10. CKEditor 自定义按钮插入服务端图片

    CKEditor 富文本编辑器很好用,功能很强大,在加上支持服务端图片上传的CKFinder更是方便, 最近在使用CKFinder的时候发现存在很多问题,比如上传图片的时候,图片不能按时间降序排列,另 ...