day①:字典

字典

特点:

  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没有变
原文地址:https://www.cnblogs.com/binhy0428/p/5086063.html