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)
View Code

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

posted @ 2018-10-13 17:48  xiaoxinlong  阅读(359)  评论(0编辑  收藏  举报