字典的一些基础知识

时间:2021-04-05 13:14:46
1.字典的一般创建方式
>>> phonebook = {'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> phonebook
{'Cecil': '3258', 'Alice': '2341', 'Beth': '9102'
字典由多个键及与其对应的值构成的键-值对(键-值对称为项)。
字典中的键是唯一的,而值不是唯一的,
键可以是任意不可变类型。
2.dict 函数:通过其他映射(比如其他字典)或者(键,值)对的序列建立字典
>>> items = [('name','Gumby'),('age',42)]
>>> items
[('name', 'Gumby'), ('age', 42)]
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
也可以通过关键字来创建字典:
>>> d = dict(name = 'Gumby',age = 42)
>>> d
{'age': 42, 'name': 'Gumby'}
3.基本字典操作:
len(d)返回d中项(键-值对)的数量
>>> d
{'age': 42, 'name': 'Gumby'}
>>> len(d)
2
d[k]返回关联到键k上的值
>>> d['name']
'Gumby'
d[k]=v将值v关联到键k上
>>> d['addr'] = 'guangzhou'
>>> d
{'addr': 'guangzhou', 'age': 42, 'name': 'Gumby'}
del d[k]删除键为k的项
>>> del d['addr']
>>> d
{'age': 42, 'name': 'Gumby'}
>>>  
k in d 检查d中是否含有键为k的项
>>> 'name' in d    #查找的是键,而不是值
True
4.自动添加:即使键起初在字典中并不存在,也可以为它赋值,这样字典就会建立新的项。而(不在使用append方法或其他类似的操作的情况下)不能将值关联到列表范围之外的索引上。
>>> x = []
>>> x[42] = 'Foobar'
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    x[42] = 'Foobar'
IndexError: list assignment index out of range
>>> x = {}
>>> x[42] = 'Foobar'
>>> x
{42: 'Foobar'}
>>> x['42'] = 'foobar'        #数字字符串和整数是不同的
>>> x
{42: 'Foobar', '42': 'foobar'}
5.字典的格式化字符串:在每个转换说明符中的%字符后面加上键(用圆括号括起来),后面在跟上其他说明元素。
>>> phonebook
{'Cecil': '3258', 'Alice': '2341', 'Beth': '9102'}
>>> "Cecil's phone number is %(Cecil)s." % phonebook
"Cecil's phone number is 3258."
>>> "Cecil's phone number is %(Cecil)d." % phonebook        #格式化转换类型得和字典中的一致
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    "Cecil's phone number is %(Cecil)d." % phonebook
TypeError: %d format: a number is required, not str
6.字典方法
(1) clear 方法清除字典中所有的项,是个原地操作(类似list.sort),无返回值(或者说返回None)
>>> d = {}
>>> d['name'] = 'Gumby'
>>> d['age'] = 42
>>> d
{'age': 42, 'name': 'Gumby'}
>>> returned_value = d.clear()
>>> d
{}
>>> print(returned_value)
None
clear方法可以清除原始字典中的所有元素
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x
{'key': 'value'}
>>> x.clear()
>>> x
{}
>>> y
{}
(2) 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']}
当在副本中替换值时,原始字典不受影响,但是修改了某个值,原始字典也会改变,因为同样的值也存储在原字典中。使用深复制可以避免这个问题,赋值其包含的所有值,使用copy模块的deepcopy函数来完成操作。
>>> 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上面调用给方法,dict是所有字典的类型
{'age': None, 'name': None}
>>> dict.fromkeys(['name','age'],'(unknown)')        #不想用None作为默认值时,可以自己提供默认值
{'age': '(unknown)', 'name': '(unknown)'}
(4) get  方法是个宽松的访问字典项的方法。一般来说,如果试图访问字典中不存在的项时会报错:
>>> d = {}
>>> print (d['name'])
Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    print (d['name'])
KeyError: 'name'
>>> print (d.get('name'))        #而用get就不会
None
>>> d.get('name','N/A')        #可以自定义‘默认’值,替换None
'N/A'
>>> d['name'] = 'Eric'        #当键存在时,get用起来就像普通字典的查询一样
>>> d.get('name')
'Eric'
(5) items  方法将字典中的所有项以列表的方式返回,列表中的每一项都表示为(键,值)对的形式,但是项在返回时没有遵循特定的次序
>>> d = {}
>>> d = {'title':'Python Web Site','url':'http://www.python.org','spam':'0'}
>>> d.items()
dict_items([('spam', '0'), ('title', 'Python Web Site'), ('url', 'http://www.python.org')])
(6) keys  方法将字典中的键以列表形式返回
>>> d
{'spam': '0', 'title': 'Python Web Site', 'url': 'http://www.python.org'}
>>> d.keys()
dict_keys(['spam', 'title', 'url'])
(7) pop  方法用来获得对应于给定键的值,然后将这个键-值对从字典中移除
>>> d = {'x' : 1, 'y' : 2}
>>> d.pop('x')
1
>>> d
{'y': 2}
(8) popitem  方法类似于list.pop,后者会弹出列表的最后一个元素,但不同的是,popitem弹出随机的项,因为字典并没有“最后的元素”或其他有关顺序的概念。若想一个接一个的移除并处理项,这个方法就非常有效了。
>>> d = {'url':'http://www.python.org','spam':0,'title':'Python Web Site'}
>>> d.popitem()
('spam', 0)
>>> d
{'title': 'Python Web Site', 'url': 'http://www.python.org'}
(9) setdefault  方法在某种程度上类似于get方法,能够获得与给定键相关联的值,初次之外,set default还能在字典中不包含有给定键的情况下设定相应的键值。
>>> d = {}
>>> d.setdefault('name','N/A')    #默认值是可选的,如果不设定,会默认使用None
'N/A'
>>> d
{'name': 'N/A'}
>>> d['name'] = 'Gumby'
>>> d.setdefault('name','N/A')
'Gumby'
>>> d
{'name': 'Gumby'}
(10) 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
{'title': 'Python Language Website', 'changed': 'Mar 14 22:09:15 MET 2008', 'url': 'http://www.python.org'}
提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
update方法可以使用与dict函数(或者类型构造函数)同样的方式进行调用,这就意味着update可以和映射,拥有(键,值)对的队列(或者其他可迭代的对象)以及关键字参数一起调用。
(11) values 方法以列表的形式返回字典中的值,与返回键的列表不同的是,返回值的列表中可以包含重复的元素
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d[4] = 4
>>> d.values()
dict_values([1, 2, 3, 4])
>>> d
{1: 1, 2: 2, 3: 3, 4: 4}
7.以下几个方法在python3.x中没有了
iteritems 方法的作用和items方法大致相同,但是会返回一个迭代器对象而不是列表
iterkeys 方法返回针对键的迭代器
itervalues 方法返回值的迭代器
has_key 方法可以检查字典中是否含有特定的键。表达式d.has_key(k)相当于表达式k in d .