第三天:
字典
什么是字典?
字典是Python语言中唯一的映射类型。
映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表。
字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型。
字典类型与序列类型的区别:
1.存取和访问数据的方式不同。
2.序列类型只用数字类型的键(从序列的开始按数值顺序索引);
3.映射类型可以用其他对象类型作键(如:数字、字符串、元祖,一般用字符串作键),和序列类型的键不同,映射类型的键直4.接或间接地和存储数据值相关联。
5.映射类型中的数据是无序排列的。这和序列类型是不一样的,序列类型是以数值序排列的。
6.映射类型用键直接“映射”到值。
字典的创建
字典的基本形态dic={key1:value1, key2:value2...}
创建方式1:直接型。
>>>dict1={}
>>>dict2={‘name‘:‘tanggao‘,‘age‘:20}
创建方式2:使用工厂方法dict,通过其他映射(例如字典)或者(键,值)这样的序列对建立
>>>items=[(‘name‘,‘tanggao‘),(‘age‘,20)]
>>>dict2=dict(items)
>>>dict1=doct([(‘name‘,‘tanggao‘),(‘age‘,20)])
创建方式3:使用内建方法fromkeys()创建’默认‘字典,字典中元素具有相同的value(如果没有给出,默认为none)
>>>dict1={}.fromkeys((‘x‘,‘y‘))
>>> dict1
{‘y‘: None, ‘x‘:None}
>>>dict2={}.fromkeys((‘x‘,‘y‘),-1)
>>> dict2
{‘y‘: -1, ‘x‘: -1}
>>>dict3=dict.fromkeys(‘x‘,‘y‘)
>>> dict3
{‘x‘: ‘y‘}
>>>dict3=dict.fromkeys((‘x‘,‘y‘))
>>> dict3
{‘y‘: None, ‘x‘:None}
>>>
字典的基本操作
Len(d)返回d中 键值对的数量
d[k]返回关联到键k上的值
d[k]=v将值v关联到键k上
deld[k]删除键为k的项
kin d检查d 中是否含有键为k的项
>>>dict1={‘x‘:1,‘y‘:2}
>>>dict1
{‘y‘:2, ‘x‘: 1}
>>>dict1[‘z‘]=3
>>>dict1
{‘y‘:2, ‘x‘: 1, ‘z‘: 3}
>>>dict1[‘z‘]=4
>>>dict1
{‘y‘:2, ‘x‘: 1, ‘z‘: 4}
>>>del dict1[‘z‘]
>>>dict1
{‘y‘:2, ‘x‘: 1}
>>>‘x‘ in dict1
True
>>>
字典的格式化字符串
>>>name= {‘Tanggao‘:20,‘ZhousiYuan‘:19}
>>>"Tanggao ‘s age is %(tanggao)s." % name
>>>"Tanggao ‘s age is %(Tanggao)s." % name
"Tanggao‘s age is 20."
>>>
字典方法
1、 clear
清楚字典中所有的项,无返回值
>>>d={}
>>>d[‘name‘]=‘Tanggao‘
>>>d[‘age‘]=20
>>>d
{‘age‘:20, ‘name‘: ‘Tanggao‘}
>>>returned_value=d.clear()
>>>d
{}
>>>print returned_value
None
那么这个方法有什么用了,看看两个例子就知道了
#例子一
>>>x={}
>>>y=x
>>>x[‘key‘]=‘value‘
>>>y
{‘key‘:‘value‘}
>>>x={}
>>>y
{‘key‘:‘value‘}
#例子二
>>>x={}
>>>y=x
>>>x[‘key‘]=‘value‘
>>>y
{‘key‘:‘value‘}
>>>x.clear()
>>>y
{}
>>>
2、 copy
copy方法返回一个具有相同键值对的新字典(浅复制,因为值本身就是相同的,而不是副本)
相比于直接把某个字典赋给一个引用变量的区别如下:
>>>x={‘x‘:1,‘y‘:2}
>>>y=x
>>>y
{‘y‘:2, ‘x‘: 1}
>>>x[‘x‘]=33
>>>y
{‘y‘:2, ‘x‘: 33}
但是下面两种情况:
在副本中替换值的时候,原始字典不受影响
>>>x={‘username‘:‘admin‘,‘machines‘:[‘foo‘,‘bar‘,‘baz‘]}
>>>y=x.copy()
>>>y[‘username‘]=‘Tanggao‘
>>>y
{‘username‘:‘Tanggao‘, ‘machines‘: [‘foo‘, ‘bar‘, ‘baz‘]}
>>>x
{‘username‘:‘admin‘, ‘machines‘: [‘foo‘, ‘bar‘, ‘baz‘]}
修改了某个值,而不是替换,浅度复制的字典将受到影响,解决这种问题的方法就是使用深度复制deepcop方法
>>>fromcopy import deepcopy
>>>d={}
>>>d[‘name‘]=[‘tom‘,‘tg‘]
>>>c=d.copy()
>>>dc=deepcopy(d)
>>>d[‘name‘].append(‘Gao‘)
#字典的值变了
>>>c
{‘name‘:[‘tom‘, ‘tg‘, ‘Gao‘]}
#深度复制不受原始字典的影响了,完完全全是独立的了
>>>dc
{‘name‘:[‘tom‘, ‘tg‘]}
3、 fromkeys
fromkeys方法使用给定的键建立新的字典,每个键默认对应的值为None
>>>dict1={}.fromkeys((‘x‘,‘y‘))
>>>dict1
{‘y‘:None, ‘x‘: None}
>>>dict2={}.fromkeys((‘x‘,‘y‘),-1)
>>>dict2
{‘y‘:-1, ‘x‘: -1}
>>>dict3=dict.fromkeys(‘x‘,‘y‘)
>>>dict3
{‘x‘:‘y‘}
4、 get
通过键访问值,平时如果通过一般方法访问键的值,如果键不存在会报错,而get方法不会
>>>d={}
>>>print d[‘name‘]
Traceback(most recent call last):
File "<stdin>", line 1, in<module>
KeyError:‘name‘
>>>print d.get(‘name‘)
None
>>>d[‘name‘]=‘Tanggao‘
>>>print d.get(‘name‘)
Tanggao
5、 has_key
检查字典中是否含有给出的键,相当于 key in d,但是Python3.0中没有这个方法
>>>d[‘name‘]=‘Tanggao‘
>>>print d.get(‘name‘)
Tanggao
>>>d.has_key(‘name‘)
True
>>>d.has_key(‘age‘)
False
6、 items和iteritems
items方法将所有的字典项以列表方式返回,无序返回
>>>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‘)]
iteritems方法的作用大致相同,但是会返回一个迭代器对象而不是列表,这个迭代器可以通过next0方法访问每个项,直到到达最后一个项,访问完最后一项,再接着遍历访问就会报错
>>>it=d.iteritems()
>>>it
<dictionary-itemiteratorobject at 0xbd70a8>
>>>it.next()
(‘url‘,‘http://www.python.org‘)
>>>it.next()
(‘spam‘,0)
>>>it.next()
(‘title‘,‘Python Web Site‘)
>>>it.next()
Traceback(most recent call last):
File "<stdin>", line 1, in<module>
StopIteration
7、 key和iterkeys
key方法将字典中的键以列表形式返回,而iterkeys则返回针对键的迭代器
>>>ll=d.keys()
>>>ll
[‘url‘,‘spam‘, ‘title‘]
>>>it1=d.iterkeys()
>>>it1.next()
‘url‘
>>>it1.next()
‘spam‘
>>>it1.next()
‘title‘
>>>it1.next()
Traceback(most recent call last):
File "<stdin>", line 1, in<module>
StopIteration
8、 pop
pop方法将字典中的某项删除,以列表形式返回删除的项
>>>d={‘title‘:‘Python Web Site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}
>>>d.pop(‘spam‘)
0
9、 popitem
随机弹出字典中的项
>>>d={‘title‘:‘Python Web Site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}
>>>d.pop(‘spam‘)
0
>>>d={‘title‘:‘Python Web Site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}
>>>d.popitem()
(‘url‘,‘http://www.python.org‘)
>>>d.popitem()
(‘spam‘,0)
>>>d.popitem()
(‘title‘,‘Python Web Site‘)
>>>d.popitem()
Traceback(most recent call last):
File "<stdin>", line 1, in<module>
KeyError:‘popitem(): dictionary is empty‘
10、 setdefault
setdefalut方法能够获得与给定键相关联的值,除此之外,还能在字典中不含有给定键的情况下设定相应的键值。注意:如果键不存在的时候,setdefault返回默认值并且相应地更新字典,如果键存在,那么就返回与其对应的值,但是不改变字典。默认值可选,如果不设定,为None
>>>d={}
>>>d.setdefault(‘name‘,‘Tg‘)
‘Tg‘
>>>d
{‘name‘:‘Tg‘}
>>>d[‘name‘]=‘Tom‘
>>>d
{‘name‘:‘Tom‘}
>>>d.setdefault(‘name‘,‘Tg‘)
‘Tom‘
>>>d
{‘name‘:‘Tom‘}
>>>d1={}
>>>print d1.setdefault(‘name‘)
None
>>>d1
{‘name‘:None}
11、 update
update方法可以利用一个字典更新另外一个字典,提供的字典的项会被添加到旧的字典中,若键相同,则覆盖
>>>d={‘title‘:‘Python Web Site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}
>>>x={‘title‘:‘Tanggao is good ‘,‘age‘:20}
>>>d.update(x)
>>>d
{‘url‘:‘http://www.python.org‘, ‘age‘: 20, ‘spam‘: 0, ‘title‘: ‘Tanggao is good ‘}
>>>
12、 values和itervalues
values方法以列表的形式返回字典中的值,itervalues返回值的迭代器
>>>d={}
>>>d[1]=1
>>>d[2]=2
>>>d[3]=3
>>>d[4]=1
>>>d.values()
[1,2, 3, 1]
>>>it=d.itervalues()
>>>it.next()
1
>>>it.next()
2
>>>it.next()
3
>>>it.next()
1
>>>it.next()
Traceback(most recent call last):
File "<stdin>", line 1, in<module>
StopIteration
13、sorted
sorted(dic.iteritems(), key=lambda d:d[1], reverse=False)
说明:对字典dic中的元素按照d[1](d[1]是value,d[0]是key,和d没关系,可以改为a什么的)进行升序排序,通过设置reverse的True或False可以进行逆序,并返回排序后的字典(该排序后的字典由元组组成,其形式为[(key1,value1),(key2,value2),...],且原字典保持不变)
>>>d={‘title‘:‘Python Web Site‘,‘url‘:‘http://www.python.org‘,‘spam‘:0}
>>>sorted(d)
[‘spam‘,‘title‘, ‘url‘]
>>>sorted(d.iteritems(),key=lambda d:d[1])
[(‘spam‘,0), (‘title‘, ‘Python Web Site‘), (‘url‘, ‘http://www.python.org‘)]
>>>sorted(d.iteritems(),key=lambda d:d[0])
[(‘spam‘,0), (‘title‘, ‘Python Web Site‘), (‘url‘, ‘http://www.python.org‘)]
>>>sorted(d.iteritems(),key=lambda d:d[0],reverse=True)
[(‘url‘,‘http://www.python.org‘), (‘title‘, ‘Python Web Site‘), (‘spam‘, 0)]
>>>
方法总结: