4.1 字典的使用

字典:通过名字来引用值的数据结构,又称为映射
字典中的值并没有特殊的顺序,但是都存储在一个特定的键下
字典提供的功能:快速查找特定键值对应关系
 

某些情况下,字典比列表更好用一些,比如:

1.标识一个游戏期盼的状态,每个键都是由坐标值组成的元组
2.存储文件修改时间,用文件名作为键
3.数字电话、地址簿
 
问题:为什么用字符串而不用整数来表示电话号码?
为了防止产生误识别
 

4.2 创建和使用字典

phonebook = {'Alice':1567,'Beth':'','Cecil':0010}
字典有多个键-值对构成,空字典由两个大括号构成,如{}
注意:字典中的键是唯一的,值不唯一

4.2.1 dict函数

可以使用dict函数,通过其他映射(比如字典)或者(键,值)对的序列建立字典
items = [('name','Gumby'),('age',43)]
d = dict(items)
>>> print d
{'age': 43, 'name': 'Gumby'}

4.2.2 字典的基本操作

len(d) :返回d总的键值对数量
d[k]    :返回关联到键k上的值
d[k]=v :将值v关联到键k上
del d[k]:删除键为k的项
k in d   :检查d中是否含有键为k的项
 
键类型:不一定是整型,可以是任意的不可变类型,如浮点型(实型)、字符串或者元组

4.2.3 字典的格式化字符串

phonebook = {'Alice':1567,'Beth':'','Cecil':0010}
>>> "Cecil's phone number is %(Cecil)s." % phonebook
"Cecil's phone number is 8."

4.2.4 字典方法

1.clear:清除字典中的所有项

这个操作没有返回值

2.copy:返回一个具有相同键值对的新字典

这一种复制是浅复制
浅复制:
x = {'username':'admin','machine':['foo','bar','baz']}
y = x.copy()
y['username'] = 'mlh'
y['machine'].remove('bar')
print y
print x #结果如下
{'username': 'mlh', 'machine': ['foo', 'baz']}
{'username': 'admin', 'machine': ['foo', 'baz']}
可以看到,当在副本中替换值的时候,原始字典不受影响,但是如果修改了某个字,原始字典也会发生变化,因为同样的也存储在原字典中,避免浅复制的一种方法就是使用深复制,复制其包含的所有值,可以使用copy模块的deepcopy来实现
深度复制:
from copy import deepcopy
d = {}
d['names'] = ['Alfed','Bertand']
c = d.copy()
dc = deepcopy(c)
dc['names'].append('Clive') print c
print dc
#结果如下:
{'names': ['Alfed', 'Bertand']}
{'names': ['Alfed', 'Bertand', 'Clive']}

3.fromkeys:使用给定的键建立新字典

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

4.get:更宽松的访问字典方法

一般来说,如果试图访问字典中不存在的项时会出错,而用get就不会
>>> d = {}
>>> d['name']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print d.get('name')
None
可以看到,但是用get访问一个不存在的键时,没有任何异常,而得到了None值。还可以自定义默认值,替换None
>>> print d.get('name','N/A')
N/A
如果键存在,get用起来就像普通的字典查询一样
>>> d['age'] = 43
>>> d.get('age')
43

5.haskey:判断是否有特定键

相当于表达式k in d.

6.item与iteritems:将字典的值以列表形式返回

items方法将字典中所有项以列表的形式返回,列表中的每一项表示为(键、值)对的形式,但是项在返回时并没有遵循特定的次序
>>> d = {'name':'Lily','age':24}
>>> d.items()
[('age', 24), ('name', 'Lily')]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是一个列表
>>> it = d.iteritems()
>>> print it
<dictionary-itemiterator object at 0x7f54e5fff158>
>>> print list(it)
[('age', 24), ('name', 'Lily')]

7.keys与iterkeys:将字典中的键以列表形式返回

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

8.pop:获得相应键的值,并删除键值对

>>> d
{'age': 24, 'name': 'Lily'}
>>> d.pop('name')
'Lily'
>>> d
{'age': 24}

9.popitem:弹出最后一个元素

列示于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitems弹出随机的项,因为字典并没有“最后的元素”或者其他有关顺序的概念。弱项一个接一个的移除并处理项,这个方法就非常有效了

10.setdefault:获得给定键相关联的值

类似于get方法,能够获得与给定键相关联的值,除此之外,setdefault还能在字典中不含有给定键的情况下设定相应的键值
>>> 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返回默认值并且相应的更新字典。如果键存在,那么就返回与其对应的值,但不改变字典。默认值是可选的,这点和get一样,如果不设定,就会使用None
>>> d = {}
>>> d.setdefault('name',[]).append(my_sister)
>>> d
{'name': ['Anne']}
>>> d.setdefault('name',[]).append('my_sister')
>>> d
{'name': ['Anne', 'my_sister']}

11.update:利用一个字典项更新另一个字典

例:
>>> d = {'name':'Gumby','age':42,'address':'BeiJing'}
>>> x = {'name':'Lily'}
>>> d.update(x)
>>> d
{'age': 42, 'name': 'Lily', 'address': 'BeiJing'} #d中的name值已随x更新
>>> x
{'name': 'Lily'}

12.values与itervalues:返回字典中的值

values方法以列表的形式返回字典中的值,itervalues返回值得迭代器
4.3 小结
映射:映射可以使用任意不可变对象标识元素。最常用的类型是字符串和元组。python唯一内建的映射类型是字典
利用字典格式化字符串:可以通过在格式化说明符中包括名称(键)来对字典应用字符串格式化操作。当在字符串格式化中使用元组时,还需要对元组中的每一个元素都设定“格式化说明符”,在使用字典时,所用的说明符可以比在字典中用到的项少
字典的方法:
 
 
 
 
 
 

python笔记04:字典的更多相关文章

  1. Python笔记之字典循环

    Python笔记之字典循环   1.问题 Python是一门比较好入门的编程语言,但是入门简单,当然坑也是有的,今天就来介绍一个我遇到的坑吧,也是很简单的一个,就是当时脑子有点转不过弯来了. 先看代码 ...

  2. Python笔记4——字典的一些基本操作

    #字典 key-value #添加 my_family= {"father": "weihaiqing", "mother": " ...

  3. Python数据类型-04.字典

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据 ------------ 完美的分割线 ------------- 1.字典引入 # 为何还要用字典?存放一个人的信 ...

  4. python笔记-dict字典的方法2

    #!/usr/bin/env python #-*- coding:utf-8 -*- ''' 概述: 使用键值(key-value)存储,具有极快的查找速度 注意:字典是无序的 key的特性: 1. ...

  5. python笔记-dict字典的方法

    #!/usr/bin/env python #-*- coding:utf-8 -*- #打印0001-9999的数字 for i in range(9999): s = "%04d&quo ...

  6. 我的Python笔记04

    摘要: 声明:本文整理借鉴金角大王的Python之路,Day4 - Python基础4 (new版)   本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件 ...

  7. Python笔记 #04# Methods

    源:DataCamp datacamp 的 DAILY PRACTICE  + 日常收集. Methods String Methods List Methods 缺一 Methods You can ...

  8. python笔记04

    数据类型(二) 今日内容 1.列表 2.元组 内容回顾和补充 1.计算机基础 ①硬件:cpu,内存,硬盘,主板,网卡 ②操作系统:linux,centos, Ubuntu,redhat windows ...

  9. Python笔记:字典的fromkeys方法创建的初始value同内存地址问题

    dict中的fromkeys()函数可以通过一个list来创建一个用同一初始value的dict. d = dict.fromkeys(["苹果", "菠萝"] ...

随机推荐

  1. hdu 3698 UVA1490 Let the light guide us 线段树优化DP

    题目链接 and 题目大意 hdu3698 但是 hdu的数据比较弱,所以在这luogu提交吧UVA1490 Let the light guide us 有一个\(n*m\)的平原,要求每行选一个点 ...

  2. 51Nod 1344 走格子(贪心

    1344 走格子   有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i ...

  3. Python Sip [RuntimeError: the sip module implements API v11.0 to v11.2 but the PyQt5.QtCore module requires API v11.3]

    不知道原因,尝试卸载.编译安装均失败.只有这样曲线救国 import matplotlib matplotlib.use("WXAgg",warn=True) import mat ...

  4. C# ashx接收ContentType="text/xml"类型值

    public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain&qu ...

  5. 使用better-scroll遇到的问题

    项目中想给侧边栏添加一个滚动效果,用better-scroll帮助实现,引入better-scroll后,给外层最大盒子添加了<aside ref="asideMenu"&g ...

  6. 深入理解Hadoop之HDFS架构

    Hadoop分布式文件系统(HDFS)是一种分布式文件系统.它与现有的分布式文件系统有许多相似之处.但是,与其他分布式文件系统的差异是值得我们注意的: HDFS具有高度容错能力,旨在部署在低成本硬件上 ...

  7. spring boot 开发 提交form表单出错

    提交表单时,字段有的没有值,springboot 会报错. org.springframework.validation.BindException: org.springframework.vali ...

  8. Python mysql-数据库基础知识

    2017-09-05 19:10:55 一.数据库定义 从本质上讲,数据库就是信息的集合,它可以存在很长时间,往往是很多年.一般来讲,"数据库"这个词指的是有数据库管理系统管理的数 ...

  9. Linux-Load Average解析

    load Average 转自:http://www.blogjava.net/sliverfancy/archive/2013/04/17/397947.html 1.1:什么是Load?什么是Lo ...

  10. Confluence 6 配置 LDAP 连接池

    当 LDAP 连接池被启用后,LDAP 目录服务器将会维护一个连接池同时当必要的时候指派他们.当一个连接关闭后,这个连接将会放回到连接池中供以后进行使用.这种设置将会有效的提高系统性能. 希望配置 L ...