Python基础教程第四章学习笔记——字典:当索引不好用时

4 字典:当索引不好用时(一种数据结构—映射)

字典时Python中唯一内建的映射类型

4.1 字典的使用

假如有一人名列表:
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
接下来要创建一个可存储这些人电话号码的小型数据库,可以创建一个新的列表
>>> numbers = ['2341', '9102', '3158', '0142', '5551']               #电话号码以字符串的形式储存,因为其可能以0开头,这是八进制的标志,所以0142=98,所以以字符串存储。
查找电话就可以:
>>> numbers[names.index('Cecil')]
3158
但是并不实用,期望以下效果:
>>> phonebook['Cecil']
3158

4.2 创建和使用字典

创建:
phonebook = {'Alice':'2341', 'Beth': '9102', 'Cecil': '3258'}
大括号、冒号、逗号;前一个为键,后一个为值 — 键唯一,值并不唯一

4.2.1 dict函数:通过其他映射(如其他字典)或者(键,值)这样的序列对建立字典。

>> items = [('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d 
{'age': 42, 'name': 'Gumby'}
>>> d['name']
'Gumby'
也可通过关键字参数来创建字典:
>>> d = dict(name = 'Gumby', age = 42)
>>> d
{'age': 42, '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的项。
重要区别:
键类型:不一定是整型数据,也可能是其他不可变类型:浮点型、字符串或元组
自动添加:即使一个键开始在字典中不存在,也可以为其分配一个值,从而字典建立新的项。列表就不能在索引外关联某个值
成员资格:k in d 查找的是键,而不是值。v in l  查找的却是值,而不是索引。
总结:键可以是任何不可变类型,可以自动添加字典不含有的键
>>> x = []
>>> x[42] = 'Foobar'
IndexError: ....
>>> x = {}
>>> x[42] = 'Foobar'
>>> x
{42: 'Foobar'}
涉及代码清单4-1 字典示例

4.2.3 字典的格式化字符串

格式化字符串可以是只以字符串为键的字典。
>>> phonebook = {'Beth': '9102', ‘Alice’: '2341', 'Cecil': '3258'}
>>> " Cecil's phone number is %(Cecil)s." % phonebook            #在每个转换说明符的%字符后,加上用圆括号括起来的键。然后在跟上其他说明元素。
" Cecil's phone number is 3258."
在模板系统中非常有用

4.2.4 字典方法

1 clear:清除字典中所有的项。是一个原地操作,无返回值(返回None)
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()                       #x,y共同关联的原始字典被清空,所有y = {}; 而如果操作为 x = {},则x关联到一个新的字典被清空,而原始字典没变,y仍与其关联。
>>> y
{}
2 copy: 返回一个具有相同键-值对的字典(浅复制—值本身相同,不是一个副本)
>>> x = {'username': 'admin', machines': ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> y['username'] = 'mlh'                               #替换了键username对应的值,原始字典不变(即x不变)
>>> y[machines'].remove('bar')                      #修改了键machines对应的值,原始字典也发生改变(即x也变了)
>>> y
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x
{'username': 'admin', 'machines': ['foo','baz']}
深复制,复制其包含所有的值:
>>> from copy import deepcopy
>>> d ={}
>>> d['name'] = ['Alfred', 'Bertrand']
>>> c = d.copy()
>>> dc = deepcopy(d)
>>> d['name'].append('Clive')
>>> c
{'name': ['Alfred', 'Bertrand', 'Clive']}
>>> dc
{'name': ['Alfred','Bertrand']}
3 fromkeys: 使用给定的键建立新的字典,每个键默认对应的值为None
>>> {}.fromkeys(['name', 'age'])             #空字典建立一个新字典
{'age': 'None', 'name': 'None'}

>>> dict,fromkeys(['name', 'age'])          #直接在所有字典的类型dict上调用方法
{'age': 'None', 'name': 'None'}

>>> dict.fromkeys(['name', 'age'], '(unknown)')         #可以自己提供默认值
{'age': '(unknown)', 'name': '(unknown)'}
4 get: 是更宽松的访问字典项的方法—,访问字典中不存在的项时也不会报错
>>> d = {}
>>> print d.get('name')            #访问一个不存在键,无异常,返回None值。可以自己设置默认值:d.get('name', 'N/A')
None
>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'
涉及代码清单4-2
5 has_key: 检查字典中是否含有给出的键
>>> d = {}
>>> d.has_key('name')
False
6 items和iteritems: item将所有字典项以列表方式返回;iteritems大致也是,但会返回一个迭代器对象而不是列表。
>>> 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')]
>>> it = d.iteritems()
>>> it
<dictionary - iterator object at 169050>
>>> list(it)
[('url','http://www.python.org'), ('spam', 0), ('title', 'Python Web Site')]
7 keys和iterkeys: keys将字典中的键以列表形式返回,iterkeys返回针对键的迭代器
8 pop: 获取对应于给定键的值,然后将这个键-值对从字典中移除。
>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}
9 popitem:类似于list.pop(会弹出列表的最后一个元素),但是popitem弹出随机项,因为字典无最后的元素或其他相关顺序概念
>>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python Web Site'}
10 setdefault: 某种程度上类似于get方法,即能获得给定键相关联值;还能在字典不含有给定键的情况下设定相应的键值。
>>> d = {}
>>> d.setdefault('name', 'N/A')               #键不存在时,setdefault返回默认值并且相应的更新字典。其中默认值可选,不设定就会是None
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name', 'N/A')                #键存在时,返回与之对应的值,但不改变字典。
'Gumby'
>>> d
{'name': 'Gumby'}
11 update:可以利用一个字典项更新另外一个字典
>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org',
             'changed': 'Mar 14 22:09:15 MET 2008'}
>>> x = {'title': 'Python Language Website'}
>>> d.update(x)
>>> d
{'changed': 'Mar 14 22:09:15 MET 2008', 'title': 'Python Language Website', 'url': 'http://www.python.org'}  #提供的字典中的项会添加到旧字典中,若有相同键就会进行覆盖
12 values和itervalues: values以列表的形式返回字典中的值;itervalues返回值的迭代器。返回值的列表可包含重复元素
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
[1,2,3,1]

4.3 小结

1 映射:可使用任何不可变对象标识元素。最常用类型是字符串和元组。
2 利用字典格式化字符串:在格式化说明符中包括键来对字典应用字符串格式化操作。
3 字典的方法

4.3.1 本章新函数

dict(seq)                            用(键,值)对(或映射和关键字参数)建立字典
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值