Python入门之collections

collections模块

collections是Python内建的一个集合模块,提供了许多有用的集合类。

1、collections.Counter('string'|list|tuple):计数器功能;可以统计元素个数,以字典形式显示

>>> s
'chengd is good'
>>> t
(1, 2, 3, 1, 3, 'name', 'name')
>>> l
['chengd', 1, 2, 1, 3, 2, 'chengd']
>>> collections.Counter(s)
Counter({' ': 2, 'd': 2, 'g': 2, 'o': 2, 'c': 1, 'e': 1, 'n': 1, 's': 1, 'i': 1, 'h': 1})
>>> collections.Counter(t)
Counter({'name': 2, 1: 2, 3: 2, 2: 1})
>>> collections.Counter(l)
Counter({1: 2, 2: 2, 'chengd': 2, 3: 1})

  collections.Counter()对象方法:除字典方法外还有以下2种

  • 计数增加;collections.Counter处理后为前提
    >>> l
    ['chengd', 1, 2, 1, 3, 2, 'chengd']
    >>> l1
    [1, 1, 22, 11, 22]
    >>> obj = collections.Counter(l)    #collections对象
    >>> print(obj)
    Counter({1: 2, 2: 2, 'chengd': 2, 3: 1})
    >>> obj.update(l1)
    >>> print(obj)
    Counter({1: 4, 2: 2, 22: 2, 'chengd': 2, 3: 1, 11: 1})
  • 计数减少;collections.Counter处理后为前提

    >>> l
    ['chengd', 1, 2, 1, 3, 2, 'chengd']
    >>> l1
    [1, 1, 22, 11, 22]
    >>> obj = collections.Counter(l)
    >>> print(obj)
    Counter({1: 2, 2: 2, 'chengd': 2, 3: 1})
    >>> obj.subtract(l1)
    >>> print(obj)    #处理后,不存在元素会记负数
    Counter({2: 2, 'chengd': 2, 3: 1, 1: 0, 11: -1, 22: -2})

    注:方法可以通过help(),dir()查看

2、collections.OrderedDict():有序字典;

  使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

  如果要保持Key的顺序,可以用OrderedDic

  • 创建有序字典:
    import collections
    obj = collections.OrderedDict([('a', 1), ('b', 2), ('c', 3)])    #创建是注意元素顺序,有序字典是安装创建顺序显示
    #或者obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3)))
    
    
    '''
    或者
    OrderedDict的Key会按照插入的顺序排列,不是Key本身排序
    obj = collections.OrderedDict()
    obj['a'] = '1'
    obj['b'] = '2'
    obj['c'] = '3'
    print(obj)
    '''
    print(obj)
    #执行结果
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    '''
    原理:通过字典和列表实现
    dic = {'k1':'v1','k2':'v2','k3':'v3'...}
    lis = ['k1','k2','k3'...]
    for i in lis:
    print(dic[i])
    '''

     

    注:创建有序字典的参数可以是列表/元组但不能为字典,否则依然是无序的

    import collections
    obj = collections.OrderedDict({('a', 1), ('b', 2), ('c', 3)})
    print(obj)
    执行结果:
    OrderedDict([('b', 2), ('c', 3), ('a', 1)])
    OrderedDict([('b', 2), ('a', 1), ('c', 3)])

     

  • 有序字典只是特殊的字典,会继承字典方法,但会有些不同
  1. obj.popitem():按照顺序(从后往前)删除并弹出item;字典是随机删除item
    import collections
    obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3)))
    print(obj)
    print(obj.popitem())
    print(obj)
    执行结果
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    ('c', 3)
    OrderedDict([('a', 1), ('b', 2)])
  2. dic.pop('key'):指定key删除并弹出value;通字典一样
    import collections
    obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3)))
    print(obj)
    print(obj.pop("b"))
    print(obj)
    执行结果
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    2
    OrderedDict([('a', 1), ('c', 3)])
  3. dic.move_to_end('key'):移动指定key到最后,字典是无序的所以无此方法
    import collections
    obj = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3)))
    print(obj)
    print(obj.move_to_end("b"))
    print(obj)
    执行结果
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    None
    OrderedDict([('a', 1), ('c', 3), ('b', 2)])

    注:方法可以通过help(),dir()查看

3、collections.defaultdict('type(list|str|func)'[,key=value]) :默认字典;默认字典取不存在key值,会根据指定类函数返回值(list|str|自定义函数等)

import collections
def def_dict():    #自己创建函数
    return "N/A"

def def_func():
    dic = collections.defaultdict(def_dict,age = 99)    #函数本是,而不是执行函数
    dic["name"] = "chengd"
    dic['k1']
    print(dic)

def def_list():
    dic = collections.defaultdict(list,age = 99)    #系统函数list
    dic["name"] = "chengd"
    dic['k1']
    print(dic)

def def_str():
    dic = collections.defaultdict(str,age = 99)   #系统函数str
    dic["name"] = "chengd"
    dic['k1']
    print(dic)

def_func()
def_list()
def_str()
执行结果
defaultdict(<function def_dict at 0x0000000000B6F1E0>, {'k1': 'N/A', 'age': 99, 'name': 'chengd'})
defaultdict(<class 'list'>, {'k1': [], 'age': 99, 'name': 'chengd'})
defaultdict(<class 'str'>, {'k1': '', 'age': 99, 'name': 'chengd'})

默认字典遍历数值字符,并统计字符数量

import collections
ss = '1111222233334444'
dict_int = collections.defaultdict(int)
for s in ss:            #s值轮训字符串ss
    dict_int[s] += 1    #int类型可以做运算;dict_int[s]值为int。类似list可以append等操作
print(dict_int)
执行结果:
defaultdict(<class 'int'>, {'4': 4, '2': 4, '1': 4, '3': 4})

  注:方法可以通过help(),dir()查看

4、collections.namedtuple() 可命名元组

根据namedtuple可以创建一个包含tuple所有功能以及其他功能的类型;常用于二维、三维坐标

import collections
MytupleClass = collections.namedtuple('MytupleClass',['x','y','z'])
obj = MytupleClass(11,22,33)
print(obj.x)
print(obj.y)
print(obj.z)
#可以通过指定值访问元组元素
执行结果:
11
22
33

  注:方法可以通过help(),dir()查看

5、collections.deque():双向队列

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

deque是特殊的列表,具有部分列表方法,并具有其独特的方法;通过dir(deque)和dir(list)对比可知

from collections import deque

l = [1,2,3,4,5,6]
d = deque(l)
print(type(d))
#append(value)添加右侧最后方单个元素;
d.append(7)
print(d)
#appendleft(value)添加左侧最前方单个元素;
d.appendleft(0)
print(d)
#pop()删除右侧最后方单个元素
d.pop()
print(d)
#pop()删除左侧最前方单个元素
d.popleft()
print(d)
#extend('seq')添加多个元素,seq是序列类型;直接添加多个元素在右侧
d.extend((11,12,13))
print(d)
#extendleft('seq')添加多个元素,seq是序列类型;直接添加多个元素在左侧
d.extendleft([101,102,103])
print(d)
#把d尾部元素按从后到前顺序插到首部
d.rotate()
print(d)
执行结果:
<class 'collections.deque'>
deque([1, 2, 3, 4, 5, 6, 7])
deque([0, 1, 2, 3, 4, 5, 6, 7])
deque([0, 1, 2, 3, 4, 5, 6])
deque([1, 2, 3, 4, 5, 6])
deque([1, 2, 3, 4, 5, 6, 11, 12, 13])
deque([103, 102, 101, 1, 2, 3, 4, 5, 6, 11, 12, 13])

 

posted @ 2017-06-26 22:00  chengd  阅读(435)  评论(0编辑  收藏  举报