字典 dict
- key-value键值对的数据的集合
- 可变的、无序的、key不重复
字典dict定义 初始化
d = dict() 或者 d={}
dict(**kwargs) 使用name=value对 初始化一个字典
-
dict(iterable, **kwargs) 使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元组
- d = dict(((1,'a'),(2,'b'))) 或者 d = dict(([1,'a'],[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))
- d=dict.fromkeys(range(5),0)
字典元素的访问
-
d[key]
返回key对应的值value
key不存在抛出KeyError异常
-
get(key[,default])
返回key对应的值value
key不存在返回缺省值,如果没有设置默认缺省值就返回None
-
setdefault(key[,default])
- 返回key对应的值value
- key不存在,添加kv对,value设置为default,并返回default,如果default没有设置,缺省为None
字典增加和修改
-
d[key] = value
将key对应的值修改为value
key不存在添加新的kv对
-
update[other] -> other
使用另一个字典的kv对更新本字典
key不存在,就添加
key存在,覆盖已经存在的key对应的值
-
就地修改
- d.update(red=1)
- d.update((('red',2),))
- d.update({'red':3})
字典删除
-
pop(key[,default])
key存在,移除它,并返回它的value
key不存在,返回给定的default
default未设置,key不存在则抛出KeyError异常
-
clear()
- 清空字典
-
del语句
- d = {'a':1, 'b':b, 'c':[1,3,5]}
- del d['c'] #看着像删除了一个对象,本质上减少了一个对象的引用,del实际上删除的是名称,二不是对象
字典遍历
Python3中,key、values、items方法返回一个类似一个生成器的可迭代对象,不会吧函数的返回结果复制到内存中
Dictionary view 对象,可以使用len()、iter()、in()操作
字典的entry的动态的视图,字典变化,视图将反应出这些变化
keys返回一个类set对象,也就是看着一个set集合。如果values都可以hash,那么itens也可以看做是类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) for k in keys: d.pop(k) print(d)
字典的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_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用这个工厂函数来生成key对应的value
import random d = {} for k in 'abcdef': for i in range(random.randint(1, 5)): if k not in d.keys(): d[k] = [] d[k].append(i) print(d) ## 使用defaultdict函数 from collections import defaultdict d = defaultdict(list) for k in 'abcdef': for i in range(random.randint(1,5)): d[k].append(i) print(d)
OrderedDict
collections.OrderedDict([items])
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
3.6版本的Python的字典就是记录key插入的顺序(IPython不一定效果)
-
应用场景:
- 加入使用字典记录N个产品,这些产品使用ID从小到大加入到字典中
- 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为顺序是有序的
- 否则还需要重新把遍历到的值排序