Python序列之字典

字典中的key必须是可散列序列,例如可以用数字、字符串或元组,但不能用列表.

1、可散列序列

可散列序列需满足以下三个条件:

  1. 该序列必须是可hash的,内部实现了__hash__方法
  2. 该序列必须是可比较的,内部实现了__eq__方法
  3. 该序列必须是不可变的,比如元组、数字、字符串、实现了只读属性的类

字典通过key在内部建立了hash表,通过hash表进行key的匹配,采用的是空间换时间的方式,占用内存大,但查询速度快,查询速度和体积关系不大。

2、创建字典

(1)从列表创建字典

dict.fromkeys(list[,value=None]) 

创建一个以list中的各个元素为key,值为value的列表,其中value可省略,默认为None

keylist=['a','b','c']

mydict = dict.fromkeys(keylist)

创建只有key,而value为None的字典:dict.fromkeys(list)

(2)从元组或列表创建字典

mytuplelist=[('a',1),('b',2),('c',3)]
mydict = dict(mytuplelist)
mylist=[['a',1],['b',2],['c',3]]
mydict = dict(mylist)

(3)通过zip函数创建字典

keylist =['a','b','c']
valuelist =[1,2,3]
mydict=dict(zip(keylist,valuelist))

3、常用字典函数

mydict.clear() 

清空字典

newdict=mydict.copy() 

复制字典

value=mydict.get(k[,default=None]) 

获得键k对应的值,可以设置默认值,在k不存在时返回default值,默认不存在时返回None

value=mydict.setdefault(k[,default=None])

当k存在时,返回k的value,

当k不存在时,将k设置进字典,并返回设置的default

mydict.items() 

获得(key,value)列表

mydict.keys()  

获得key的列表

mydict.values() 

获得value的列表

value=mydict.pop(k) 

删除k对应的value并返回,k不存在时报错

mydict.update({k:v}) 

更新k的值v,如果k不存在,则添加新的k:v

4、字典推导式

mydict = {keyexpression:valueexpression for var in range(n)}

mydict = {keyexpression:valueexpression for var in list}

mydict = {keyexpression:valueexpression for i,j in zip(x,y)}

5、字典合并

对于字典 a={xxx}  b={xxx}

(1)c = dict(**a,**b)合并成一个新字典c,当合并的两个字典中有相同的key时报错

(2)a.update(b) 将b合并到a,如果b和a有相同的key,则b的值覆盖a的值

6、字典的迭代和修改

由于往字典里添加新键可能会改变已有键的顺序,如果在迭代一个字典的过程中同时对字典进行修改,那么这个循环很有可能会跳过一些key。因此,一定不要对字典同时进行迭代和修改。如果确定要这么做,可以先调用字典的copy函数建立副本来处理。

7、collections.defaultdict

访问普通字典里的元素时,如果key在字典里不存在会报错。这时defaultdict就能排上用场了,defaultdict的作用是,当访问字典里元素时,如果key不存在,返回的不是keyError而是一个默认值。defaultdict接受一个工厂函数作为参数,如下来构造:

dict =defaultdict( factory_function)

这个factory_function可以是list、set、str等等,作用是当key不存在时,返回的是工厂函数的默认值,比如list对应[ ],str对应的是空字符串,set对应set( ),int对应0

from collections import defaultdict


dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)

print(dict1[1])  #输出0
print(dict2[1])  #输出set()
print(dict3[1])  #输出空字符
print(dict4[1])  #输出[]

8、collections.ordereddict

python中的字典dict是无序的,因为它是按照hash来存储的。

collections模块里的OrderedDict字典,实现了对字典中元素的有序存放。

(1)OrderedDict会根据放入元素的先后顺序进行排序。在不同的OrderedDict字典对象中,如果元素顺序不同,Python会把它们当做不同的对象。

(2)当需要对普通字典中的值进行有序存储时,可以借助OrderedDict。

实例:

dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

#按key排序

kd = collections.OrderedDict(sorted(dd.items(), key=lambda t: t[0]))

#按照value排序

vd = collections.OrderedDict(sorted(dd.items(),key=lambda t:t[1]))

(3)OrderedDict对象的popitem()方法

OrderedDict.popitem([last= True])

OrderedDict对象的popitem方法默认删除并返回的是字典里的最后一个元素(先进先出,队列),但是如果像 my_odict.popitem(last=False) 这样调用它,那么它删除并返回第一个被添加进去的元素(先进后出,栈)。可以借助该函数实现先进先出(队列)或先进后出(栈)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值