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])
来源: http://www.92to.com/bangong/2018/08-20/34038716.html