Python中collections模块总结

collections

–Python标准库,是数据结构常用的模块,实现了特定目标的容器;collections包含了一些针对Python内置的容器,例如dict、list、set、tuple ,为其提供了替代选择。

Counter:字典的子类,计算可哈希的对象;
defaultdict:字典的子类,可以调用提供默认值的函数;
OrderedDict:字典的子类,保留了他们被添加的顺序,可以记住元素的添加顺序;
namedtuple:创建命名元组子类的工厂函数;
deque:类似列表容器,实现了在两端快速添加(append)和弹出(pop);///常用方法: append() appendleft() extend() extendleft() pop() popleft() count() insert(index,obj) rotate(n) clear() remove() maxlen ///
ChainMap:类似字典的容器类,将多个映射集合到一个视图里面

counter()

主要功能:可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
常用方法:
**elements():**返回一个迭代器,每个元素重复计算的个数,如果一个元素的计数小于1,就会被忽略。
**most_common([n]):**返回一个列表,提供n个访问频率最高的元素和计数
**subtract([iterable-or-mapping]):**从迭代对象中减去元素,输入输出可以是0或者负数
**update([iterable-or-mapping]):**从迭代对象计数元素或者从另一个 映射对象 (或计数器) 添加。

deque()

class collections.deque([iterable[, maxlen]])
是双向队列 double-ended queue 的缩写;支持线程安全,以近似O(1)的时间复杂度的性能在deque的两端插入和删除元素 ;返回一个从左到右初始化的新deque对象(使用append()),其中包含来自iterable的数据,如果未指定iterable,则new deque为空。
尽管list也支持相似的操作,但是它主要在固定长度操作上的优化,在数据量很大的时候使用list在列表头插入和删除元素的效率很慢。
(list有append()和insert(index,value)两个添加方法,append()方法只能在在列表的尾部追加元素,而insert(index)虽然能在指定的位置去添加元素,但是他需要去遍历list才行,且时间复杂度为O(N)。而list中的删除有del names[index],pop()或者pop(index),remove(value)可以看出list删除除了pop()[删除列表末尾的元素]之外,剩下的都需要去遍历list列表,而且pop(0)和insert(0, v)操作会改变底层数据表示的大小和位置,时间复杂度也是O(N)。

deque对象常用方法

append(): 在deque的右边添加元素

d = deque("abcd")
d1 = deque([0, 1, 2, 3])
d.append(4)
d1.append("k")
print(d)
print(d1)
>>>deque(['a', 'b', 'c', 'd', 4])
>>>deque([0, 1, 2, 3, 'k'])

appendleft(): 在deque的左边添加元素

d = deque("abcd")
d1 = deque([0, 1, 2, 3, 5 ])
d.appendleft(4)
d1.appendleft("k")
print(d)
print(d1)
>>>deque([4, 'a', 'b', 'c', 'd'])
>>>deque(['k', 0, 1, 2, 3, 5])

extend(): 通过添加来自iterable参数的元素来扩展deque的右侧

ex = (1, "h", 3)
d = deque("abcd")
d1 = deque([0, 1, 2, 3])
d.extend(ex)
d1.extend(ex)
print(d)
print(d1)
>>>deque(['a', 'b', 'c', 'd', 1, 'h', 3])
>>>deque([0, 1, 2, 3, 1, 'h', 3])

extendleft(): 把列表中的元素进行迭代,先取出第一个元素,然后放在左边,然后再去取出下一个,重复执行,就得到了最终的结果。

from collections import deque
d = deque([1,2,3])
d.extendleft(['a','b','c'])
print(d)
>>>deque(['c', 'b', 'a', 1, 2, 3])

pop(): 从deque的右侧删除并返回一个元素。

from collections import deque
d = deque("abcd")
d1 = deque([0, 1, 2, 3])
p = d.pop()
p1 = d1.pop()
print(p)
print(p1)
print(d)
print(d1)
>>>d
>>>3
>>>deque(['a', 'b', 'c'])
>>>deque([0, 1, 2])

popleft(): 从deque的左侧删除并返回一个元素。

from collections import deque
d = deque("abcd")
d1 = deque([0, 1, 2, 3])
p = d.popleft()
p1 = d1.popleft()
print(p)
print(p1)
print(d)
print(d1)
>>>a
>>>0
>>>deque(['b', 'c', 'd'])
>>>deque([1, 2, 3])

count(): 计算deque中的指定元素的个数

from collections import deque
d = deque("abbcd")
b = d.count("b")
print(b)
>>>2

insert(index,obj): 在指定位置插入元素

from collections import deque
d = deque("abbcd")
d.insert(2, "chl")
print(d)
>>>deque(['a', 'b', 'chl', 'b', 'c', 'd'])

rotate(n): 向右旋转deque n个步骤。如果n是负的,向左旋转。
当deque不为空时,向右旋转一步等价于d.appendleft(d.pop()),向左旋转一步等价于d.append(d.popleft())。

from collections import deque
d = deque([1,2,3,4,5])
d.rotate(1)#不填时,默认为1
print(d)
d.rotate(-2)#在已经右转了一步的基础上左转两步
print(d)
>>>deque([5, 1, 2, 3, 4])
>>>deque([2, 3, 4, 5, 1])

clear(): 删除deque中的所有元素,让它的长度为0

from collections import deque
d = deque("abbcd")
d.clear()
print(d)
>>>deque([])

remove(): 删除第一个出现的值,若无该值,则返回错误

from collections import deque
d = deque("abbcd")
d.remove("b")
print(d)
>>>deque(['a', 'b', 'c', 'd'])

maxlen: (只读属性)deque的最大大小,如果无界则为None。就是创建时的maxlen参数;初始化deque的时候可以给他传一个参数maxlen,如果deque中的元素超过maxlen的值,那么就会从deque中的一边去删除元素,也就是deque始终保持maxlen最大长度的元素,如果超过了就会自动把以前的元素弹出(删除)。

from collections import deque
d = deque([1,2,3],maxlen = 3)
print(d)
d.append(4)
print(d)
d.appendleft(5)
print(d)
>>>deque([1, 2, 3], maxlen=3)
>>>deque([2, 3, 4], maxlen=3)
>>>deque([5, 2, 3], maxlen=3)

reverse(): 将deque的元素反向放置

d = deque('abcdefg')
list(reversed(d))
>>>['g', 'f', 'e', 'd', 'c', 'b', 'a']

除了上述功能,deques 支持迭代,pickling,len(d), reversed(d), copy.copy(d), copy.deepcopy(d),
使用in操作符进行成员测试,下标引用,如d[-1], 索引访问在两端都是O(1),但在中间变慢到O(n)。对于快速随机访问,使用列表代替。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值