字典
特点:
1.key-value格式,key是唯一。
2.无序。
3.查询速度块,dict是基于hash表的原理实现的,是根据关键字而直接访问在内存存储位置的数据结构。
字典内建方法:
dict.clear() # 删除字典中所有元素
dict copy() # 返回字典(浅复制)的一个副本
dict.fromkeys(seq,val=None) # 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对的初始值
dict.get(key,default=None) # 对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default值
dict.has_key(key) # 如果键在字典中存在,则返回True ,python3.x用in和not in代替
dicr.items() # 返回一个包含字典中键、值对元组的列表
dict.keys() # 返回一个包含字典中键的列表
dict.iter() # 方法iteritems()、iterkeys()、itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表
dict.pop(key[,default]) # 和方法get()相似.如果字典中key键存在,删除并返回key的值value,如果key不存在则返回一个KeyError
dict.popitem() #无序随机删除一条元素
dict.setdefault(key,default=None) # 和set()相似,key存在返回对应值value,但如果字典中不存在key键,由default为它赋值,默认default=None。
dict.update(dict2) # 将字典dict2的键值对添加到字典dict,循环判断dict2里面的值是否存在dict,存在就更新,不存在则插入。
dict.values() # 返回一个包含字典中所有值得列表
dict([container]) # 创建字典的工厂函数。提供容器类(container),就用其中的条目填充字典
len(mapping) # 返回映射的长度(键-值对的个数)
hash(obj) # 返回obj哈希值,判断某个对象是否可做一个字典的键值
例子:
>>> message={'name':'kubi','job':'yunwei','age':'24','company':'gaiwang'} >>> message {'age': '24', 'job': 'yunwei', 'company': 'gaiwang', 'name': 'kubi'} >>> message['name'] #查看key为‘name’的value 'kubi' >>> message['job'] = 'Boss' #将key的value改为‘Boss’ >>> message {'age': '24', 'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi'} >>> message['city'] = 'GZ' #如果dict中有key为‘city’,就将其值改为‘GZ’,没有就新创一条 >>> message {'age': '24', 'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi', 'city': 'GZ'} >>> message.pop('age') #删除key为‘age’的数据 '24' >>> message {'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi', 'city': 'GZ'} >>> del message['city'] #和上面删除意思一样 >>> message {'job': 'Boss', 'company': 'gaiwang', 'name': 'kubi'} >>> message.popitem() #随机删除一条,dict空会报错 ('job', 'Boss') >>> message {'company': 'gaiwang', 'name': 'kubi'} >>> message.items() #将dict的key,value转换成列表的形式显示 [('company', 'gaiwang'), ('name', 'kubi')] >>> message.has_key('name') #判断key存不存在 True >>> message['city'] #不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'city' >>> message.get('city') #查找key,如果存在返回其value,否则返回None
>>> message.get('city',"not exsit") #还可以这样子定义!!定义一个信息,不存在这个key,返回这个信息。
'not exsit'
>>> message.get('name') 'kubi' >>> message.clear() #清空字典 >>> message {} >>> message.fromkeys(['a','b','c','d'],'Test') #根据列表['a','b','c','d']来创建dict里面的key,后面的‘test’是默认value,如果不指定的话则None {'a': 'Test', 'c': 'Test', 'b': 'Test', 'd': 'Test'} >>> message {} >>> message=message.fromkeys(['a','b','c','d'],'Test') >>> message {'a': 'Test', 'c': 'Test', 'b': 'Test', 'd': 'Test'} >>> message.setdefault('e','yaobin') #找一个key为‘e’的记录,如果这个key不存在,那就创建一个叫‘e’的key,它的值为‘yaobin’,如果这个值存在,就直接返回这个key的value,见下条 'yaobin' >>> message {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'Test'} >>> message.setdefault('d','yaobin') 'Test' >>> message {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'Test'} >>> dict2={'f':'fromDict2','d':'fromDict2'} #创建一个新字典 >>> dict2 {'d': 'fromDict2', 'f': 'fromDict2'} >>> message.update(dict2) #拿这个字典去更新message,注意dict2中有一个key值‘d’与message冲突,这时dict2中key为‘d’的value会覆盖info中key为‘d’的value,如果dict2中的key在message中不存在,则创建相应的记录 >>> message {'a': 'Test', 'c': 'Test', 'b': 'Test', 'e': 'yaobin', 'd': 'fromDict2', 'f': 'fromDict2'} >>>
遍历dict
>>> message={'name':'kubi','age':'24','job':'yunwei','phone':'12345679'} >>> message {'job': 'yunwei', 'phone': '12345679', 'age': '24', 'name': 'kubi'} ①:第一种方法,大数据量的时候要用这种方法! >>> for item in message: ... print item,message[item] ... job yunwei phone 12345679 age 24 name kubi ②:第二种方法 >>> for key,val in message.items(): ... print key,val ... job yunwei phone 12345679 age 24 name kubi
字典的深浅copy:
先理解一下变量的定义:
>>> a=1
>>> b=a
>>> a
1
>>> b
1
>>> b=3
>>> b
3
>>> a
1
其实只是把变量a所指向的内存地址copy给了变量b,修改变量b,变量a不会受影响
>>> message={111:{'name':'yaobin','age':24,'department':'IT','phone':4561},222:{'name':'hy','age':23,'department':'management Team','phone':7894},333:{'name':'nimei','age':22,'department':'HR','phone':1234}} >>> message {333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} >>> message2=message >>> message2 {333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} >>> message[111]['age']=30 >>> message[111] {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'} #发现两个数据都改了 >>> message2[111] {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'} #发现两个数据都改了 >>> id(message[111]) 140729396260208 >>> id(message2[111]) 140729396260208
##对于dict、list、tuple以及set集合,python不会像变量那么做了,而只是简单的别名,像linux软连接一样。
##因为一般来讲,一个变量存字符串、数字等简单的数据类型,存的信息不会太多,但如果存一个list或者dict,这个变量说不准,有可能几千几万条,,如果copy出来,非常消##耗资源,所以python帮你做了个软连接,
##对于复杂数据dict or list等,无论你怎么复制,最终修改的其实是一份数据。
浅copy:
copy(...)
D.copy() -> a shallow copy of D
例子:
>>> message[3333]='nothing' #首先在message增加key value,注意3333的值是字符串‘nothing’ >>> message {3333: 'nothing', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}} >>> message3=message.copy() #浅copy >>> message3 {111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}, 3333: 'nothing', 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} >>> message {3333: 'nothing', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 30, 'name': 'yaobin'}} >>> message[111]['age']=24 #修改message的第二层字典 >>> message[3333]='nimeidecacaca' #修改message的第一层字符 >>> message {3333: 'nimeidecacaca', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} ##会发现第一层的字符是变了,变为nimeidecacaca >>> message3 {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'nothing', 222: {'department': 'management Team', 'phone': 7894, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} ##会发现第一层的字符没有变,还是nothing ##会发现我修改message的第二层字典,message3的第二层字典跟着变!
完完全全的copy:
>>> import copy >>> new_message=copy.deepcopy(message) >>> new_message {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} >>> message {3333: 'hehe', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} ##message和new_message一模一样 >>> new_message {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} >>> message[3333]='new' #修改message >>> message {3333: 'new', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} >>> new_message {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'hehe', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} #new_message没有变 >>> new_message[3333]='new_new' #修改new_message >>> new_message {111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}, 3333: 'new_new', 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}} >>> message {3333: 'new', 333: {'department': 'HR', 'phone': 1234, 'age': 22, 'name': 'nimei'}, 222: {'department': 'management Team', 'phone': 54546654, 'age': 23, 'name': 'hy'}, 111: {'department': 'IT', 'phone': 4561, 'age': 24, 'name': 'yaobin'}} #message没有变