字典dict

key-value 键值对的数据的集合

可变的,无序的,key不重复,可迭代


字典dict定义 初始化

d = dict() 或者 d = {}

dict(**kwargs)使用name = value对 初始化一个字典

dict(iterable,**kwarg)使用可迭代对象的name = value对 构造字典,不过可迭代对象的元素必须是一个二元结构

d = dict(((1,"a"), (2,'b'))) 或者 dict(([1,"2"],[2,"b"]))

dict(mapping,kwarg) 使用一个字典构建另一个字典

d ={'a' : 10 , "b" : 20, "c" : None, 'd' : [1,2,3]}

类方法dict.fromkeys(iterable , value)

d=dict.fromkeys(range(5))->{0:None,1:None,2:None,3:None,4:None}d=dict.fromkeys(rang(5),0)->{0:0,1:0,2:0,3:0,4:0}

字典元素的访问

dict[key]

返回key对应的值value

key不存在抛出KeyError异常

dict.get(key[,default])

返回key对应的值value

key不存在返回缺省值,如果没有设置缺省值就返回None

dict.setdefault(key[,default])

返回key对应的值value

key不存在,添加k=v对,value设置为default,并返回default,如果default没有设置,缺省为None

字典增加和修改

dict[key] = value

将key对应的值修改为value

key不存在将添加新的k=v对

dict.update([other]) -> None

使用另个字典的kv 对更新本字典

key不存在,就添加

key存在,覆盖已经存在的key对应的值

就地修改

d.update(red=1)d.update((('red',2),))d.update({'red':3})

字典删除

dict.pop(key [, default])

key存在,移除它,并返回它的value

key不存在,返回给定的default

default未设置,key不存在则抛出keyError

dict.popitem()

移除并返回一个任意的键值对

字典为empty,抛出KeyError异常

dict.clear()

清空字典

del 语句

a=Trueb=[6]d={'a':1,'b':b,'c':[1,3,4]}deladeld['c']#并没有删除对象[1,3,4],只是他的引用次数减一了delb[0]#b这个变量之前已经被del掉

#del d['c'] 看着像删除了一个对象,本质上减少了一对象的引用,del实际上删除的是名称,而不是对象


字典遍历

for ... in dict:

遍历key

forkind:print(k)forkind.keys():print(k)

遍历value

forkind:print(d[k])forkind.keys():print(d.get(k))forvind.values():print(v)

遍历item,即k=v对

foritemind.items():->返回有2个元素的元组tupleprint(item)foritemind.items():print(item[0],item[1])fork,vind.items():print(k,v)

字典遍历总结

python3 中,keys values items方法返回一个类似一个生成器的可迭代对象,不会把函数的返回结果复制到内存中(不重复占用内存)

Dictionary view对象,可以使用len().iter(),in操作

字典的entry的动态的视图,字典变化,视图反映出这些变化

keys返回一个类set对象,也就是可以看做一个set集合.如果values都可以hash,那么items也可以看做是类set对象

[了解]python2 中,上面的方法会返回一个新的列表,占据新的内存空间.所以Python2 建议使用iterkeys,itervalues,iteritems版本,返回一个迭代器,而不是返回一个copy


字典遍历和移除

如何在遍历的时候移除元素

正确的做法:

d=dict(a=1,b=2,c='abc')keys=[]fork,vind.items():ifisinstance(v,str)keys.append(k)创建一个k的列表forkinkeys:d.pop(k)#移除cprint(d)out:{'a':1,'b':2}

错误的做法:

d=dict(a=1,b=2,c='abc')fork,vind.items():d.pop(k)#异常(dictionarychangedsizeduringiteration)whilelen(d):#相当于清空,不如直接celarprint(d.popitem())whiled:print(d.popitem())

字典的key

key的要求和set 的元素要求一致

set 的元素就可以看做key , set 可以看做dict 的简化版

hashable 可哈希才可以作为key,使用hash()测试

d = {1:0 , 2.0:3 , "abc":None , ('hello' , 'world' , 'python'):'string' , b'abc' : '135'}

defaultdict

collections.defaultdict([default_factory[, ...]])

第一个参数是default_factiory,缺省的是None,它提供一个初始化函数..当key不存在的时候,会调用这个工厂函数来生成Key对应的value

importrandomd1={}forkin'abcdef':foriinrange(random.randint(1,5)):ifknotind1.keys():d1[k]=[]#d1内增加key:[]d1[k].append(i)#key对应的value添加值print(d1)fromcollectionsimportdefaultdictimportrandomd1=defaultdict(list)forkin'abcdef':foriinrange(random.randint(1,5)):d1[k].append(i)print(d1)


OrderedDict

collections.OrderedDict([items])

key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序

有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印

应用场景

加入使用了字典记录了N个产品,这些产品使用ID由小到大加入到字典中

除了使用字典检索的遍历,有时候需要去除 ID, 但是希望是按照输入的顺序,因为输入顺序是有序的

否则还需要重新把遍历到的值排序