重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
字典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 = True b = [6] d = {'a':1,'b':b,'c':[1,3,4]} del a del d['c'] # 并没有删除对象[1,3,4],只是他的引用次数减一了 del b[0] # b这个变量之前已经被del掉
#del d['c'] 看着像删除了一个对象,本质上减少了一对象的引用,del实际上删除的是名称,而不是对象
字典遍历
for ... in dict:
遍历key
for k in d: print(k) for k in d.keys(): print(k)
遍历value
for k in d: print(d[k]) for k in d.keys(): print(d.get(k)) for v in d.values(): print(v)
遍历item,即k=v对
for item in d.items(): -> 返回有2个元素的元组tuple print(item) for item in d.items(): print(item[0],item[1]) for k,v in d.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 = [] for k,v in d.items(): if isinstance(v,str) keys.append(k) 创建一个k的列表 for k in keys: d.pop(k) # 移除c print(d) out:{'a': 1, 'b': 2}
错误的做法:
d = dict(a =1,b = 2,c = 'abc') for k,v in d.items(): d.pop(k) #异常( dictionary changed size during iteration) while len(d): # 相当于清空,不如直接celar print(d.popitem()) while d: 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
import random d1 = {} for k in 'abcdef': for i in range(random.randint(1,5)): if k not in d1.keys(): d1[k] = [] # d1 内增加key:[] d1[k].append(i) # key对应的value添加值 print(d1) from collections import defaultdict import random d1 = defaultdict(list) for k in 'abcdef': for i in range(random.randint(1,5)): d1[k].append(i) print(d1)
OrderedDict
collections.OrderedDict([items])
key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
应用场景
加入使用了字典记录了N个产品,这些产品使用ID由小到大加入到字典中
除了使用字典检索的遍历,有时候需要去除 ID, 但是希望是按照输入的顺序,因为输入顺序是有序的
否则还需要重新把遍历到的值排序