字典dict
1、字典是可变的、无序的、key不重复(可hash)的非线性结构;【set的元素就是key,key可hash唯一,任何可变的数据结构(list,bytearry,dict,set)都不可以hash】
*args表示任何多个无名参数,它是一个tuple
**kwargs表示关键字参数,它是一个dict
2、字典的定义:【构造字典的特点:因为字典是键值对构成的,构造的时候要么是空的,要么是两个两个构造(1、key=value 2、可迭代对象内是二元的)】
【1】d = dict() 或者 d = {}
【2】dict(**kwargs) 使用可迭代对象和 name=value对 构造字典,不过可迭代对象的元素必须是一个二元结构;(eg = [ ('a',1) ] 或者 [['a',1]] ) 两层嵌套,里外两层可以是列表也可以是元组;他们可以相同;也可以理解为dict() 里必须为可迭代对象,而可迭代对象必须为二元的(两个两个的)
eg:d = dict(((1,'a'), (2,'b'))) 或者 d = dict(([1,'a'] , [2,'b']))
a = dict(a=1,b=2) 【a,b是标识符,不能使用数字开头】
a = dict( [('a',1),('b',2),c = 3,d = 4] ) 特别注意: 其中c = 3,d = 4与二元结构混合时必须写到末尾,否则报错;这里如果有a = 5会覆盖二元结构中的a,但是如果这里再多写一个c = 6就会报错,并不会覆盖之前的c = 3【**kwargs】
【3】dict(mapping, **kwarg) 使用一个字典构建另一个字典;
【5】d = {‘a’:10,‘b’:20,‘c':None,’d‘:[1,2,3] }
【6】类方法 dict.fromkeys(iterable,value)
eg: d = dict.fromkeys(range(5))
d = dict.fromkeys(range(5),0)
3、字典元素的访问
【1】d[ key ]
1、返回key对应的值value
2、如果key不存在抛出KeyError异常
【2】get( key [,default] )
1、返回key对应的value值
2、如果key不存在返回缺省值default,如果没有设置缺省值就返回None
特别注意:d[ key ]中如果key不存在会报异常、会报异常、会报异常;而get(key[,default])如果key不存在则不会报异常、不会报异常、不会报异常;
【3】setdefault( key[,default] )
1、返回key对应的值
2、key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,缺省值为None;
4、字典增加和修改
【1】d[key] = value
1、将key对应的值修改为value
2、key不存在添加新的kv对
【2】update( [other] ) → None
1、使用另一个字典的kv对更新本字典;(二元组,a=1都可以)
2、key不存在,就添加;
3、key存在,覆盖已经存在的key对应的值;
4、就地修改
5、字典的删除
【1】pop(key[,default ])
1、key存在,移除它,并返回它的value;
2、key不存在,返回给定的default;
3、default未设置,key不存在则抛出KeyError异常;
【2】popitem():随机删除
1、移除并返回一个任意的键值对;【返回的是一个元组】
2、字典为empty(空),抛出KeyError异常;
【3】clear()
1、清空字典;
【4】del 语句
1、del a[ 'c' ]:看着像是删除了一个对象,本质上减少了一个对象的引用,del实际上删除的是名称,而不是对象;
2、如果key不存在,会报NameError异常;
6、字典的遍历【在迭代的过程中字典不能被改变(长度)】
【1】dict.keys()
1、keys()可以不写直接遍历字典,默认遍历字典的key;
2、返回的是可迭代对象;
【2】dict.values()
1、如果要遍历字典的 value 必须写dict.values(),value()不能省略;
2、返回可迭代对象;
【3】dict.items()
1、要遍历 kv 对 items() 不能省略;
2、返回的是可迭代对象,【可迭代对象是一个个元组tuple】
eg:for k,v in dict.items():【items是二元组,所以必须拿k,v拆,拆了可单找key或者value;不拆的话直接拿一个标识符,则表示返回二元组键值对】
总结:
【1】Python3中,keys、values、items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中;
【2】Dictionary view对象,可以使用len() 、iter() 、in 操作;【iter():返回的是一个迭代器对象;】
【3】字典的entry(items或者kv对)的动态的视图,字典变化,视图将反映出这些变化;【实时变化,如果字典发生了改变,调用视图方法将改变后的结果实时返回】
【4】keys返回一个类set对象,也就是可以看做一个set集合。如果values都可以hash,那么items也可以看做是类set对象;
特别注意:
【在迭代的过程中字典不能被改变(长度)】、如果想在迭代过程中删除字典,必须记录字典的key值,在另一个不是遍历字典的循环中来删除字典(遍历这些key);【列表list在迭代过程中删除元素,使用while循环,使用for循环删不干净】
eg:keys = []
for k in dict.keys():
if k % 2:
keys.append(k)
for k in keys:
dict.pop(k)
7、缺省字典defaultdict
collections模块下的defaultdict,【缺省字典的使用:当key不存在时,就会调用缺省字典,使用缺省字典中的函数方法构造一个空的1键值对,value类型需要看该函数方法的类型】
defaultdict(list):当key缺省时构造键值对,value为空list列表;
8、有序字典OrderedDict
key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序
【1】有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印;
【2】3.6版本的Python的字典就是记录key插入的顺序(IPython不一定有效果)
【3】应用场景:
1、假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中;
2、除了使用字典检索的遍历,有时候需要去除ID,但是希望是按照输入的顺序,因为输入顺序是有序的;
3、否则还需要重新把遍历到的值排序;
9、sorted(iterable,reverse=False)
sorted函数排序后返回一个新的列表,列表里放着你需要排的数,并不会影响原本的iterable;
10、统计dict中有default的方法:
get(key[,default])
setdifaultdict(key[,default])
pop(key[,default])