python字典
1、字典解释
映射:通过名字来引用值得数据结构,字典是python中唯一内建的映射类型,字典中的值并没有特殊的顺序,都存储在一个特定的键下,键可以使数字、字符串、元组,通过查找某个特定键,就可以找到对应的值
(1)使用列表实现电话薄查找:
>>> name = ['zyj','sl','xm'] >>> numbers = ['123','456','789'] >>> numbers = [123,456,0789]#注:数字之前加0会出现语法报错。以0开头的数字应该表示为数字字符串,而不是整数(python3中使用0o开头表示8进制,python2中在数字前面加0表示8进制,因此会出错) SyntaxError: invalid token >>> print(numbers[name.index('sl')]) 456 >>>
(2)使用字典实现:键值对和大括号组成,键值之间使用冒号,项之间使用逗号。键时唯一的,值并不唯一
>>> phonebook = {'zyj':123,'sl':456,'xm':789} >>> print(phonebook['sl']) 456 >>>
2、字典创建
dict:字典函数,通过其他映射或者键值对的序列建立字典
>>> items = [('name','zyj'),('sex','male')] >>> d = dict(items) >>> print(d) {'sex': 'male', 'name': 'zyj'} >>> print(d['sex']) male >>>
通过关键字参数创建字典
>>> d = dict(name ='zyj',sex='male') >>> print(d) {'sex': 'male', 'name': 'zyj'} >>>
创建空字典
>>> d = dict() >>> print(d) {} >>>
3、基本字典操作
(1)len(d) 返回d中项(键值对)的数量
>>> d = dict(name1 = 'zyj',score1 = 90,name2 = 'sl',score2 = '60') >>> print(d) {'name2': 'sl', 'name1': 'zyj', 'score1': 90, 'score2': '60'} >>> print(len(d)) 4 >>>
(2)d[k] 返回关联到键k上的值
>>> print(d['score1']) 90 >>>
(3)d[k] = v 将值v关联到键k上
>>> d = dict(name = '') >>> d['name'] = 'zyj' >>> print(d) {'name': 'zyj'} >>>
(4)del d[k] 删除键为k的值
>>> del d['name'] >>> print(d) {} >>>
(5)k in d 检查d中是否含有键位k的项
>>> print('name' in d) False >>> d = dict(name= 'zyj') >>> print('name' in d) True >>>
4、字典特性
1、键类型:任意不可变类型,如数字、字符串、元祖
2、自动添加:通过给键赋值,字典可以创建新的项。不能将值关联到列表范围之外的索引上。
3、成员资格:k in d 查找的是键,而不是值。而V in list用来查找值。
>>> x = [] >>> x[42] = 'zyj' Traceback (most recent call last): File "<pyshell#63>", line 1, in <module> x[42] = 'zyj' IndexError: list assignment index out of range >>> print(x) [] >>> x = {} >>> x[42] = 'zyj' >>> print(x) {42: 'zyj'} >>> x = [None]*43 >>> x[42] = 'zyj' >>> print(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, 'zyj'] >>>
键可以为元组
>>> dict1 = {} >>> dict1[(1,2),(3,4)] = 105 >>> print(dict1) {((1, 2), (3, 4)): 105} >>>
5、字典的格式化字符串
在%后面加上键(用原括号括起来),后面跟上其他说明元素。
>>> phonebook = {'zyj':123,'sl':456,'lm':789} >>> print('zyj\'s phone number is %(zyj)s.' % phonebook) zyj's phone number is 123. >>> score = dict(chinese=100,english=99,math=89) >>> print('zyj\'s score is 语文:%(chinese)s 英语:%(english)s 数学:%(math)s' % score) zyj's score is 语文:100 英语:99 数学:89 >>>
6、字典示例
编写一个简单的数据库,实现查找一个人的电话或者地址:
people = { 'zyj' : { 'phone':'123', 'addr':'45' }, 'sl' : { 'phone':'456', 'addr':'56' }, 'xm' : { 'phone':'789', 'addr':'78' } } lables = { 'phone' : 'phone number', 'addr' : 'address' } name = input('name: ') requset = input('p or a:') if requset == 'p': key = 'phone' if requset == 'a': key = 'addr' if name in people: print("%s's %s is %s" % (name,lables[key],people[name][key])) >>> name: zyj p or a:p zyj's phone number is 123 >>>
7、字典方法
clear方法清除字典中所有的项,原地操作,返回值为None。
>>> d = dict(name='zyj',age='20') >>> print(d) {'name': 'zyj', 'age': '20'} >>> d1 = d >>> print(d1) {'name': 'zyj', 'age': '20'} >>> print(id(d1)) 44760960 >>> print(id(d)) 44760960 >>> d1['name'] = 'admin' >>> print(d1) {'name': 'admin', 'age': '20'} >>> print(d) {'name': 'admin', 'age': '20'} >>> d1 = d.clear() >>> print(d,d1) {} None
copy方法返回一个具有相同键值对的新字典,浅复制。
浅复制:值本身相同,不会产生副本。当替换时,原始字典不受影响,但是当修改了某个值(原地修改而不是替换),原始字典会发生改变
深复制:生成副本,使用copy模块中的deepcopy函数完成操作。
>>> x = {'username':'zyj','permition':['r','w']} >>> y = x.copy() >>> y['username'] = 'admin' >>> y['permition'].remove('w') >>> print(y) {'permition': ['r'], 'username': 'admin'} >>> print(x) {'permition': ['r'], 'username': 'zyj'} >>> from copy import deepcopy >>> d = {'user':'zyj','permition':['r','w']} >>> d1 = d.copy() >>> d2 = deepcopy(d) >>> print(id(d1),id(d2)) 44793568 44793088 >>> d1['permition'].append('o') >>> print(id(d1),id(d2)) 44793568 44793088 >>>
fromkeys方法使用给定的键建立新的字典,每个键都对应一个默认的值None
>>> d = dict() >>> d1 = d.fromkeys(['name','permition']) >>> print(d1) {'permition': None, 'name': None} >>> print(dict.fromkeys(['name','permition'])) {'permition': None, 'name': None} >>>
若不想使用None为默认值,可以通过参数的方式提供默认值
>>> print(dict.fromkeys(['name','permition'],'(zyj)')) {'permition': '(zyj)', 'name': '(zyj)'} >>> print(dict.fromkeys(['name','permition'],'zyj')) {'permition': 'zyj', 'name': 'zyj'} >>>
get方法是个更宽松的访问字典项的方法。当访问的字典项不存在时不会报错,返回None,可以自定义默认值来替换None,使用get方法提供默认值,可以使得程序在接收到非期望值时做出合理的处理。
>>> d = dict() >>> print(d.get('name')) None >>> print(d.get('name','N/A')) N/A >>> d['name'] = 'zyj' >>> print(d.get('name')) zyj >>>
has_key方法可以检查字典中是否含有特定的键。相当于 k in d,python3.0中不包含此函数。
>>> d = {} >>> print(d.has_key('name')) Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> print(d.has_key('name')) AttributeError: 'dict' object has no attribute 'has_key' >>> print('name' in d) False
items方法将字典所有的项以列表方式返回,(键,值)对的形式表示,另外返回时没有遵循特定的次序,在python3中取代iteritems。即返回一个迭代器而非列表,iteritems方法与items作用大致相同,但是会返回一个迭代器对象而不是列表。在python3中没有此方法,使用items代替。
>>> d = {'name':'zyj','permition':['r','w']} >>> d1 = d.items() >>> print(d1) dict_items([('permition', ['r', 'w']), ('name', 'zyj')]) >>> print(list(d1)) [('permition', ['r', 'w']), ('name', 'zyj')] >>> d = {'name':'zyj','permition':['r','w']} >>> d1 = d.iteritems() Traceback (most recent call last): File "<pyshell#46>", line 1, in <module> d1 = d.iteritems() AttributeError: 'dict' object has no attribute 'iteritems' >>> print(d1) dict_items([('permition', ['r', 'w']), ('name', 'zyj')]) >>> print(list(d1)) [('permition', ['r', 'w']), ('name', 'zyj')] >>>
keys方法将字典中的键以列表的形式返回,而iterkeys则返回针对键的迭代器.同样在python3中使用keys代替iterkeys。
>>> d = {'name':'zyj','permition':['r','w']} >>> d1 = d.keys() >>> print(d1) dict_keys(['permition', 'name']) >>> print(list(d1)) ['permition', 'name'] >>>
values和itervalues 以列表的形式返回字典中的值,(返回值的迭代器),python3中使用values代替itervalues
>>> >>> d = {'name':'zyj','permition':['r','w']} >>> print(d.values()) dict_values([['r', 'w'], 'zyj']) >>> print(list(d.values())) [['r', 'w'], 'zyj'] >>>
pop方法用于获得给定键的值,并将这个键值对从字典中移除.pop返回的是给定键的值,同时将原字典中给定的键值对移除。
>>> d = {'name':'zyj','permition':['r','w']} >>> print(d.pop('permition')) ['r', 'w'] >>> print(d) {'name': 'zyj'} >>
popitem方法类似与list.pop。区别是popitem弹出的是随机的项,因为字典中没有’最后的元素‘此方法可以一个接一个地移除并处理项,由于字典的无序性,因此字典没有类似append等价的方法。
>>> d = {'name':'zyj','permition':['r','w']} >>> print(d.popitem()) ('permition', ['r', 'w']) >>>
setdefault方法类似与get,能够获取与给定键相关的值,同时setdefault可以在字典中不含有给定项的情况下设定相应的默认值;
当键不存在时,setdefault返回默认值并且更新字典。如果键存在,就返回与其对应的值
>>> d = {'name':'zyj','permition':['r','w']} >>> print(d.setdefault('score','N/A')) #将('score':'N/A')更新到字典中 N/A >>> print(d.setdefault('name','N/A')) zyj >>> print(d) {'permition': ['r', 'w'], 'score': 'N/A', 'name': 'zyj'} >>>
update方法可以利用一个字典项更新另外一个字典,提供字典中的项会添加到旧字典中,若有相同键将会进行覆盖
>>> >>> d = {'name':'zyj','permition':['r','w']} >>> d1 = {'name':'admin'} >>> d.update(d1) >>> print(d) {'permition': ['r', 'w'], 'name': 'admin'} >>> d = {'name':'zyj','permition':['r','w']} >>> d1 = {'score':'90'} >>> d.update(d1) >>> print(d) {'permition': ['r', 'w'], 'score': '90', 'name': 'zyj'} >>>