2014年(13)
分类: Python/Ruby
2014-03-08 23:51:32
字典:通过名字引用值的数据结构,这种数据类型称为映射,字典是python中唯一内建的映射类型。字典中的值没特殊的顺序,但存储在一个特定的键里,键可以是数字,字符串甚至元组
>>> na=['chen','shen','er','xi']
>>> nu=['1234','4567','9874','4561']
>>> na.index('shen')
1---------序号
>>> nu[1]
'4567'
>>> nu[na.index('shen')]
'4567'
1. 创建和使用字典
例如:hh={‘chen’:’123’,’shen’:’123’}
-------------字典由多个键及对应的值构成的对组成,形如:{键:值}
--------------空字典:{}
dict函数
通过其他映射比如其他字典或者(键,值),这样的序列对建立字典
>>> hh=[('name','chen'),('age',11)]
>>> d=dict(hh)
>>> d
{'age': 11, 'name': 'chen'}
>>> d['name']
'chen'
>>>
>>> d=dict(name='chen',age=12)--------通过关键字参数创建字典
>>> d
{'age': 12, 'name': 'chen'}
基本字典操作
Len(d)返回d中项(键-值对)的数量
d[k]返回关联到键k上的值
d[k]=v将值v关联到键k上
del d[k]删除键为k的项
k in d检查d中是否有含有键为k的项------成员资格(字典比列表更高效),查找的是键,而不是值(区别列表中的v in l查找值,不是索引)
---------例
>>> d
{'age': 12, 'name': 'chen'}
>>> d['age']
12
>>> len(d)
2
>>> d['name']=shen----------------------注意是字符串
Traceback (most recent call last):
File "
d['name']=shen
NameError: name 'shen' is not defined
>>> d['name']='shen'
>>> d
{'age': 12, 'name': 'shen'}
>>> del d['name']
>>> d
{'age': 12}
>>> 'name' in d
False
键类型:整形,浮点型,字符串,元组等
自动添加:一个键期初不存在,分配一个值后字典中就会建立新的项
键可以为任何不可变类型
>>> x=[]
>>> x[42]='chen'-----将字符串关联到空列表42号位置个根本不可能
Traceback (most recent call last):
File "
x[42]='chen'
IndexError: list assignment index out of range
>>> x={}
>>> x[42]='chen'-------字典可以将值可以关联到42键上
>>> x
{42: 'chen'}
>>> x=[None]*43
>>> x[42]='chen'
>>> x--------------------列表必须用None初始化才可以关联元素
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'chen']
>>>
电话本例子:
people={
'alice':{
'phone':'2341',
'addr':'foo frice 23'
},
'beth':{
'phone':'9102',
'addr':'bar street 42'
},
'cail':{
'phone':'3158',
'addr':'baz avenue 90'
}
}
labels={
'phone':'phone number',
'addr':'address'
}
name=input('name: ')
request=input('phone number(p) or address(a)?')
if request =='p': key='phone'
if request =='a': key='addr'
if name in people: print ("%s's %s is %s."% \
(name,labels[key],people[name][key]))
结果:
>>>
name: beth
phone number(p) or address(a)?p
beth's phone number is 9102.
>>>
字典的格式化字符串
>>> ph={'shen':'1234','er':'3456','xi':'7784'}
>>> "xi phone number is %(xi)s."%ph------%后面可加上(键),在后面跟上其他说明元素
'xi phone number is 7784.'
转换说明符还是和以前一样,这类字符串格式化在系统模板中非常有用,
例:
>>> template='''
%(text)s
'''
>>> data={'title':'my home page','text':'welcome to my home page!'}
>>> print (template %data)
welcome to my home page!
字典方法
clear-----清除字典中的项,原地操作,无返回值(None)
>>> d={}
>>> d['name']='chen'
>>> d['age']=23
>>> d
{'name': 'chen', 'age': 23}
>>> hh=d.clear()
>>> d
{}
>>> print (hh)
None
>>>
情况一:
>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x={}
>>> y
{'key': 'value'}-----------x,y最初对应同一字典,将x关联到空字典来对y无影响,相当于创建了y副本,关联着原来的字典,同一字典两个别名,x重新指向后对y无影响
情况二:
>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x.clear()
>>> y
{}
>>> -------------clear清空的是字典中的元素亦或数据,而不直接清空别名
copy---------返回一个具有相同键-值对的新字典(浅复制,值本身就相同,而不是副本)
>>> x={'name':'chen','shen':['tutu','tulu','tmd']}
>>> y=x.copy()
>>> y['name']='er'
>>> y['shen'].remove('tmd')
>>> y
{'name': 'er', 'shen': ['tutu', 'tulu']}
>>> x
{'name': 'chen', 'shen': ['tutu', 'tulu']}
>>>
-------------------副本替换值,原字典不受影响,如果修改了某个值(删除,原地修改),原字典也会变,同样的值也在原字典中---------用深复制避免此问题
>>> d={}
>>> d['name']=['shen','tulu']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d
{'name': ['shen', 'tulu']}
>>> d['name'].append('er')
>>> c
{'name': ['shen', 'tulu', 'er']}
>>> dc
{'name': ['shen', 'tulu']}-----------并未因为增加元素而改变,深复制相当于复制出单独无联系的一份
Fromkeys--------------使用给定的键建立新的字典,每个键默认对应的值为None
>>> {}.fromkeys(['name','age'])
{'name': None, 'age': None}
>>> dict.fromkeys(['name','age'],'unknow')
{'name': 'unknow', 'age': 'unknow'}------------可自己指定默认值unknow
>>>
get--------宽松的访问字典项
>>> print(d['name'])
Traceback (most recent call last):
File "
print(d['name'])
KeyError: 'name'-----------------严格要求键不为空
>>> print(d.get('name'))-----------访问不存在的键时,宽松对待,还返回None,键存在时就是普通的字典查询
has_key-----------检查字典中是否含有给出的键,相当于k in d(python 3.0不支持)
Items和iteritems---------将所有的字典项以列表方法返回,每一项都来自于(键,值),项在返回时并没有特殊的顺序。Iteritems会返回一个迭代器对象。
keys和iterkeys---------将字典的键以列表方式返回,而iterkeys返回对象的迭代器,
pop------用来获得对应于给定键的值,然后将该键-值从字典中移除
>>> d={'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}
>>>
popitem---------类似list.pop----会弹出列表最后一个元素,popitem弹出随机项
>>> d
{'y': 2}
>>> d={'x':1,'y':2,'z':3}
>>> d.popitem()
('y', 2)
>>> d
{'x': 1, 'z': 3}
-----------------字典是无序的
setdefault----------能够获得给定键相关联的值,还能在字典不含给定键的情况下设定相应的键值
>>> d={}
>>> d.setdefault('name','n/a')
'n/a'
>>> d
{'name': 'n/a'}
>>> d['name']='chen'
>>> d.setdefault('name','n/a')
'chen'
>>> d
{'name': 'chen'}
--------------当键不存在时,返回默认值,并更新字典,键存在,就返回相应的值,不改变字典。默认None
update-----------可以利用一个字典项更新另一个字典
>>> d={'name':'shen','ming':'zhiyu','aihao':'gay'}
>>> x={'name':'er'}
>>> d.update(x)
>>> x
{'name': 'er'}
>>> d
{'ming': 'zhiyu', 'name': 'er', 'aihao': 'gay'}
>>>
------------提供的键会添加到旧字典中,相同的键进行覆盖
values和itervalues ---------------values以列表形式返回字典的“值”(itervalues返回值的迭代器),返回键的列表不能包含重复元素,返回值的列表可以。
>>> d={}
>>> d[1]=1
>>> d[2]=2
>>> d[3]=3
>>> d[4]=4
>>> d.values()
dict_values([1, 2, 3, 4])
>>> d[5]=4
>>> d.values()
dict_values([1, 2, 3, 4, 4])
总结:
字典:{} 格式:{‘x’:’y’}
映射:可以使用任何不可变对象标识元素。常见类型:字符串和元组