python标准库之collections
数据类型
namedtupl
deque
Counter
OrderedDict
defaultdict
ChainMap
UserDict
UserList
UserString
在将这个之前先讲下list和tuple
list列表
实例
//直接复制
classmates = ['Michael','bob','Tracy']
len(classmates) 长度
classmates[0] 加索引
classmates[-2] 表示倒数第二个元素
classmates.appen('Adam') 添加元素在尾部
classmates.insert(1,'Jack') 在制定位置插入元素,其他元素后移
classmates.pop() 删除末尾的元素
classmates.pop(i)删除指定位置元素
classmates[1] = 'Sarah' 把某个元素替换成别的元素
list中的元素类型也可以不同。例如
L=['Apple',123,True]
list中还可以包含list,例如 s=['python','java',['asp','php'],'scheme']
有s[2][1]='php'
空的list长度为0
tuple 元组,有序列表,但是一旦初始化后就不能更改
classmates = (‘Michael’,'Bob','Tracy')注意使用小括号
tuple没有append(),insert()方法
定义空tuple
t = ()
注意一个陷阱,定义一个只有一个元素的tuple
t=(1,) 显示的时候也是(1,)避免和数学意义上的括号混淆
t=(1) 实际上是 t=1 因为数学意义上认为是小括号
tuple的元素不变性质是指tuple中的每个元素'不变',假设tuple中有个是列表,那这个元素是列表a就是不变的,但是这个列表内部就可能发生改变
这里只讲一下collections中的一些简单用法
namedtuple 和字面意思一样,创建一个自定义的tuple对象,并且规定了tuple元素的个数,并且可以使用属性而不是索引来引用tuple的某个元素。
1 from collections import namedtuple 2 Point = namedtuple('Point',['x','y']) 3 p=Point(1,2)
p是对象Point的子类,而Point是tuple的子类
deque是为了实现高效实现插入和删除的双向列表,适用于队列和栈
1 from collections import deque 2 q = deque(['a', 'b', 'c']) 3 q.append('x') 4 q.appendleft('y')
deque还有方法appendleft()和popleft() 来实现头部添加和删除元素
>>> q=co.deque(range(10)) >>> q[1] 1 >>> q.append('x') >>> q.[10] File "<stdin>", line 1 q.[10] ^ SyntaxError: invalid syntax >>> q[10] 'x' >>> q.appendleft(9) >>> print(q) deque([9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'x']) >>>
defultdict 注意后面的dict
先来介绍下dict: dict是python中内置的字典,全称dictionary,在c++中称为map,使用健-值存储。
初始化用{}大括号,此外还能通过key进行存放
1 >>> map={1:233,2:333,3:555,'h':'tjj'} 2 >>> print(map) 3 {1: 233, 2: 333, 3: 555, 'h': 'tjj'} 4 >>> map['tt']='oki' 5 >>> print(map) 6 {1: 233, 2: 333, 3: 555, 'h': 'tjj', 'tt': 'oki'} 7 >>> map[1] 8 233
当map中key值不存在是,可能会报错,为防止报错,我们可以通过其他方式来取值
利用 in 来取值
1 >>> 'o' in map 2 False 3 >>> 1 in map 4 True
利用dict中get方法,这里的get如果不存在该key会返回none或者你指定的值,比如-1
1 >>> map.get(2) 2 333 3 >>> map.get('ss') 4 >>> map.get('ss',-1) 5 -1
删除其中一个值,利用pop()
1 >>> map.pop(2) 2 333 3 >>> print (map) 4 {1: 233, 3: 555, 'h': 'tjj', 'tt': 'oki'}
1 >>> map.keys() 2 dict_keys([1, 3, 'h', 'tt'])
还有需要注意的是dict中存放的顺序与key中放入的顺序无关
defaultdict 和它字面意思一样,default+dict,它与dict唯一一点不同点在于:
使用dict时,如果key值不存在,会抛出KeyError错误,而defaultdict则可以避免这种情况
1 >>> from collections import defaultdict 2 >>> dd = defaultdict(lambda:'N/A') 3 >>> dd[key]=abc 4 >>> dd['key1']=1 5 >>> dd['key1'] 6 1 7 >>> dd[2] 8 'N/A'
OrderedDict 毫无疑问,它肯定和dict有关。
使用dict时,key时无序的,在对dict做迭代时,我们无法确认key的顺序。
而是用OrderedDict时,我们可以保持key的顺序
1 >>> d = dict([('a',1),('b',2),('c',3)]) 2 >>> from collections import OrderedDict 3 >>> Od = OrderedDict([('a',1),('b',2),('c',3)]) 4 >>> d.keys 5 <built-in method keys of dict object at 0x0000004B629E6360> 6 >>> d.keys() 7 dict_keys(['a', 'b', 'c']) 8 >>> Od.keys() 9 odict_keys(['a', 'b', 'c']) 10 >>> d 11 {'a': 1, 'b': 2, 'c': 3}
Od.popitem()会弹出最后一个元素 等同于Od.popitem(last = True)
Od.popitem(last = false) 会弹出第一个元素
Counter 简单的计数器
1 >>> from collections import Counter 2 >>> c = Counter() 3 >>> for ch in 'programming': 4 ... c[ch]+=1 5 ... 6 >>> c 7 Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
Counter也是dict中的一个子类
参考:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001411031239400f7181f65f33a4623bc42276a605debf6000