《Python基础教程》学习笔记 Chap4 字典:当索引不好用时

字典是Python内唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(Key)下。


创建和使用字典

字典由多个键及与其对应的值构成的键-值对组成(我们也把键-值对称为项)。每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典是由一对大括号括起来。空字典(不包括任何项)由两个大括号组成,像{}。

>>> people = {'Lilei' : '123', 'Hanmei' : '2525'}
>>> people
{'Lilei': '123', 'Hanmei': '2525'}


dict函数

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

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

dict函数也可以通过关键字参数来创建字典,如下所示:

>>> d = dict(name = 'Gumby', age = 28)
>>> d
{'age': 28, 'name': 'Gumby'}


基本字典操作

字典的基本行为在很多方面与序列类似

len(d)返回d中项(键-值对)的数量

d[k]返回关联到键k上的值

d[k] = v将值v关联到键k上

del d[k]删除键为k的项

k  in  d     检查d中是否有含有键为k的项

尽管字典和列表有很多特性相同,但是也有以下区别:

键类型:字典的键不一定为整型数据(但也可以是),键可以是任意的不可变类型,比如浮点型、字符串或者元组。

自动添加:即使键起初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上。

成员资格:表达式k in d(d为字典)查找的是键,而不是值。表达式v  in  l(l为列表)则用来查找值,而不是索引。

>>> x = []
>>> x[1] = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> x = {}
>>> x[1] = 2
>>> x
{1: 2}

上述例子说明了第二点。


运行结果如下:



字典的格式化字符串

在每个转换说明符中的%字符后面,可以加上键(用圆括号括起来),后面再跟上其他说明元素。例:

>>> phonebook = {'Alice' : '1234', 'Beth' : '2135'}
>>> "Alice's Phone Nuber is %(Alice)s ." %phonebook
"Alice's Phone Nuber is 1234 ."



字典方法

clear

clear方法清除字典中的所有的项。这个是原地操作,所以无返回值(或者说返回值为None)。

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


copy

copy方法返回一个具有相同键值对的新字典(这个方法实现的是浅复制‘shallow copy’,因为值本身就是相同的,而不是副本)。这种方式,当在副本中替换值的时候,原字典不受影响,但是,如果修改了某个值(原地修改,而不是替换),原始的字典也会改变,因为同样的值也存储在原字典中。例:

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

避免上述问题额一种方法就是使用深度复制(deep copy),复制其包含的所有值。可以用copy模块的deepcopy函数来完成操作。

>>> from copy import deepcopy
>>> x = {'username' : 'admin', 'machines' : ['foo', 'bar', 'baz']}
>>> y = x.copy()
>>> z = deepcopy(x)
>>> x['machines'].append('dalfd')
>>> x['username'] = 'jfaj;'
>>> x
{'username': 'jfaj;', 'machines': ['foo', 'bar', 'baz', 'dalfd']}
>>> y
{'username': 'admin', 'machines': ['foo', 'bar', 'baz', 'dalfd']}
>>> z
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}


fromkeys

fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None。

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

也可以通过dict调用该方法,而且可以自己提供默认值。例:

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


get

get方法是个更宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会出错,但是使用get方法不会产生任何异常,而是得到了None值,也可以自定义“默认”值,替换None。例:

>>> d = {}
>>> print d['name']
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
KeyError: 'name'
>>> print d.get('name')
None
>>> d.get('name', 'N/A')
'N/A'


has_key

has_key方法可以检查字典中是否含有特定的键。表达式d.has_key(k)相当于k in d。

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


items和iteritems

items方法将字典所有的项以列表方式返回,列表中的每一项都表示为(键、值)对的形式。但是项在返回时并没有遵循特定的次序。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-itemiterator object at 0x030D2510>
>>> list(it)
[('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web site')]


keys和iterkeys

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

>>> d = {'title' : 'Python web site', 'url' : 'http://www.python.org', 'spam' : 0}
>>> d.keys()
['url', 'spam', 'title']
>>>it = d.iterkeys()
>>> it
<dictionary-itemiterator object at 0x030D2510>
>>> list(it)
[]


pop

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

>>> d = {'x' : 1, 'y' : 2}
>>> d.pop('x')
1
>>> d
{'y': 2}


popitem

popitem方法类似于list.pop,后者会弹出列表的最后一个元素。但不同的是,popitem弹出随机的项,因为字典中并没有“最后的元素”或者其他有关顺序的概念。若想一个接一个地移除并处理项,这个方法就非常有效了(因为不用首先获得键的列表)。例:

>>> d = {'title' : 'Python web site', 'url' : 'http://www.python.org', 'spam' : 0}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python web site'}


setdefault

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')
>>> d
{'name': None}


update

updata方法可以利用一个字典项更新另外一个字典。提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。例:

>>> d = {'title' : 'Python web site',
... 'url' : 'http://www.python.org', 
... 'changed' : 'Mar 14 22:09:05 MET 2015'}
>>> x = {'title' : 'Python language website'}
>>> d.update(x)
>>> d
{'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:05 MET 2015', 'title': 'Python language website'}
>>> y = {'spam' : 0}
>>> d.update(y)
>>> d
{'url': 'http://www.python.org', 'spam': 0, 'changed': 'Mar 14 22:09:05 MET 2015', 'title': 'Python language website'}


values和itervalues

values方法以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以有重复的元素。例:

>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 1
>>> d.values()
[1, 2, 3, 1]
>>> d.itervalues()
<dictionary-valueiterator object at 0x030D2600>
>>> list(d.itervalues())
[1, 2, 3, 1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值