字典
1. 基本概念
字典与java中的map类似,是一个无序的映射结构,由一个个键-值(key-value)对组成。字典的键是访问其元素的索引,不能重复。在字典里,一般使用字符串或整型数字作为键,(或者说任何一个含有__hash__()和__eq__()方法的对象。)字典中的值可以是任何类型的对象。
2. 创建字典
方式一:直接创建
person = {'name':'Amanda','age':12,'sex':'female','addr':'NewYork'}
说明:
字典用花括号{}括起来,每一对元素通过“键:值”的形式表达,不同的对之间用逗号分隔。
方式二:dict()函数创建
>>> items = [('Alice','02391'),('Bob','0283'),('Jimmy','2883')]
>>> dict(items)
{'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
dict()函数接收一个映射或者(键、值)序列创建字典。
3. 字典的基本操作
3.1访问字典元素
用法:dict[key],返回字典中key对应的value值。当key不存在时会引发KeyError异常。如:
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> dt['Bob']
'0283'
>>> dt['bb']
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
dt['bb']
KeyError: 'bb'
3.2 给字典添加元素
用法:dict[key]=value。当key不存在时,会新建一个元素添加到字典里。如:
>>> dt = {1:'Apple',2:'Sumsung',3:'xiaomi'}
>>> dt[4] = 'htc'
>>> dt
{1: 'Apple', 2: 'Sumsung', 3: 'xiaomi', 4: 'htc'}
3.3 修改字典元素值
用法:dict[key]=value。修改字典中已存在的key对应的value值。
>>> dt = {1:'Apple',2:'Sumsung',3:'xiaomi'}
>>> dt[3]= 'htc'
>>> dt
{1: 'Apple', 2: 'Sumsung', 3: 'htc'}
3.4 删除字典元素
用法:del dict[key]。删除字典中指定key和其对应的value值。若键key不存在,会引发keyError异常。如
>>> dt = {1:'Apple',2:'Sumsung',3:'xiaomi'}
>>> del dt[3]
>>> dt
{1: 'Apple', 2: 'Sumsung'}
>>> del dt['1']
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
del dt['1']
KeyError: '1'
3.5 获取字典键值对的数量
用法:len(dict).如:
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> len(dt)
3
3.6 检查字典中是否存在某key
用法:key in dict.检查字典dict中是否含有键为key的项,返回值为布尔型。如:
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> 'Alice' in dt
True
>>> 'Ashly' in dt
False
4.字典的格式化字符串
我们可以对一个对象进行格式化,也可以把多个对象放到元组里进行格式化。如:
>>> "What's wrong with you,%s" % 'Lily'
"What's wrong with you,Lily"
>>> "Can you caculate this statement, %d +%d?" % (12,108)
'Can you caculate this statement, 12 +108?'
现在我们也可以对一个字典进行格式化,需要在%后添加“(Key)”,被格式化的对象换成字典。如:
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> "Alice number is %(Alice)s" % dt
'Alice number is 02391'
格式化时,通过给出的key从字典中获取其对应的value值作为被格式化的对象。若key不存在则会出错。我们可以一次格式化字典中的多个对象。下面看一个例子。
temple = '''<html>
<head><title>%(title)s</title></head>
<body>
<h1>%(title)s</h1>
<p>%(text)s</p>
</body>
<html>'''
data = {'title':'Home Page','text':'welcome to my home page'}
print temple % data
程序运行结果是:
5. 字典的常用方法
下面介绍总结一些字典中常用的方法。
5.1 获取字典对应键的值get()/setdefault()
get()
用法:dict.get(key[,newValue])。返回字典中键为key的值,与dict[key]类似。不同的是,若键不存在,默认返回None,而不会抛出异常,也可以指定返回值。
>>> d = {'title':'welcome','context':'welcome to my homepage','writer':'Alice'}
>>> d.get('title')
'welcome'
>>> rs = d.get('name')
>>> print rs
None
>>> rs = d.get('name','Jhon')
>>> rs
'Jhon'
setdefault()
与get()相似,返回指定键的值。不同的是,当键不存在时,setdefault()方法会创建一个新建,对应的值默认是None,也可以设定,并返回新建对应的值。如:
>>> dt = {1:'bee',2:'fly',3:'paguin'}
#键存在
>>> dt.setdefault(1,'animal')
'bee'
>>> dt
{1: 'bee', 2: 'fly', 3: 'paguin'}
#键不存在
>>> dt.setdefault(4,'animal')
'animal'
>>> dt
{1: 'bee', 2: 'fly', 3: 'paguin', 4: 'animal'}
5.2 检查字典中是否含有某键has_key()
用法:dict.has_key(key), 相当于 key in dict.如:
>>> d = {'title':'welcome','context':'welcome to my homepage','writer':'Alice'}
>>> d.has_key('title')
True
>>> 'title' in d
True
5.3 获取字典所有的键keys()/iterkeys()
dict.keys()获取字典所有的键,返回一个列表。而dict.iterkeys()返回的是键的迭代器。需要进行迭代时才能获取到真正的键。如
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> dt.keys()
['Bob', 'Jimmy', 'Alice']
>>> it = dt.iterkeys()
#it为迭代器对象,iterator
>>> it
<dictionary-keyiterator object at 0x0134A1E0>
>>> list(it)
['Bob', 'Jimmy', 'Alice']
5.4 获取字典所有的值values()/itervalues()
与keys()/iterkeys()相似,values()/itervalues()分别返回字典的所有值的列表和其迭代器。值可以重复。如:
>>> dt = {1:'bee',2:'fly',3:'paguin',4:'fly'}
>>> dt.values()
['bee', 'fly', 'paguin', 'fly']
>>> it = dt.itervalues()
>>> list(it)
['bee', 'fly', 'paguin', 'fly']
5.5 获取字典所有的项items()/iteritems()
dict.items()以列表的形式返回字典所有的项,每一项作为一个元组。Dict.tieritems()返回的是字典所有项的一个迭代器。如
>>> dt = {'Bob': '0283', 'Jimmy': '2883', 'Alice': '02391'}
>>> dt.items()
[('Bob', '0283'), ('Jimmy', '2883'), ('Alice', '02391')]
>>> it = dt.iteritems()
#it为迭代器对象,iterator
>>> it
<dictionary-itemiterator object at 0x0130DDB0>
>>> list(it)
[('Bob', '0283'), ('Jimmy', '2883'), ('Alice', '02391')]
5.6 给字典添加项update()
用法:dict.update(obj), obj可以是一个字典,也可以是键值对。若与字典中原有的键重复,就覆盖原值。如:
>>> dt = {1:'bee',2:'fly',3:'paguin'}
>>> more = {4:'red',1:'blue'}
#字典
>>> dt.update(more)
>>> dt
{1: 'blue', 2: 'fly', 3: 'paguin', 4: 'red'}
>>> more
{1: 'blue', 4: 'red'}
#键值对
>>> dt.update([(5,'cat'),(6,'dog')])
>>> dt
{1: 'blue', 2: 'fly', 3: 'paguin', 4: 'red', 5: 'cat', 6: 'dog'}
5.7 删除字典的项pop()/popitem()
用法:dict.pop(key).删除字典指定key的项,返回key对应的值。Key不存在时引发异常。dict.popitem()随机删除字典的一项,并返回该项。如:
>>> dt = {1:'bee',2:'fly',3:'paguin',4:'beat'}
>>> dt.pop(1)
'bee'
>>> dt
{2: 'fly', 3: 'paguin', 4: 'beat'}
#键不存在
>>> dt.pop('1')
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
dt.pop('1')
KeyError: '1'
>>> dt.popitem()
(2, 'fly')
>>> dt
{3: 'paguin', 4: 'beat'}
5.8 清空字典clear()
清空字典所有的项,这是一个原地操作,无返回值。如
>>> dt = {1:'bee',2:'fly',3:'paguin'}
>>> dtcpy = dt
>>> dt.clear()
>>> dt
{}
>>> dtcpy
{}
5.9 复制字典copy()
用法:dict.copy(),返回具有相同元素的字典。
>>> srcDict = {'userName':'Jhon','sex':'male','tel':['0231','1241','2619']}
>>> cpyDict = srcDict.copy()
>>> cpyDict['userName'] = 'Jimy'
>>> cpyDict
{'userName': 'Jimy', 'tel': ['0231', '1241', '2619'], 'sex': 'male'}
>>> srcDict
{'userName': 'Jhon', 'tel': ['0231', '1241', '2619'], 'sex': 'male'}
>>> cpyDict['tel'].remove('0231')
>>> cpyDict
{'userName': 'Jimy', 'tel': ['1241', '2619'], 'sex': 'male'}
>>> srcDict
{'userName': 'Jhon', 'tel': ['1241', '2619'], 'sex': 'male'}
可以看到copy()是一种浅拷贝,不是获得字典的副本。因此若通过新变量对字典进行值替换,不会改变原字典的内容。但若修改了字典中的值,原字典也会被改变。
为了避免这种情况,我们可以使用copy模块的deepcopy()函数,它是一种深拷贝,复制原字典中包含的所有元素返回一个新对象给新变量。因此通过新变量修改字典不会影响到原来的字典。如:
>>> from copy import deepcopy
>>> srcDict = {'userName':'Jhon','sex':'male','tel':['0231','1241','2619']}>>> deepDict = deepcopy(srcDict)
>>> deepDict = deepcopy(srcDict)
>>> deepDict['tel'].remove('0231')
>>> deepDict
{'userName': 'Jhon', 'tel': ['1241', '2619'], 'sex': 'male'}
>>> srcDict
{'userName': 'Jhon', 'tel': ['0231', '1241', '2619'], 'sex': 'male'}