python三十六库之collections

本文介绍了Python标准库中的Counter和deque两种高效数据结构,Counter用于计数可哈希元素,deque支持双向队列操作。学习了如何创建、使用和方法如most_common、subtract等。deque则适用于快速添加和移除两端元素的场景,如队列和栈的通用实现。
摘要由CSDN通过智能技术生成

Collections

按照官方解释是高性能的容器数据类型

共包含一下数据结构容器

  • namedtuple

  • deque

  • Counter

  • OrderedDict

  • defaultdict

Counter

用于可计数可哈希的字典类型,无序的集合, 元素被存储为字典键,计数被存储为字典值, 计数可以是任何整数值,包括零或负数。


In [70]: for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    ...:     c[word] += 1
    ...:

In [71]: c
Out[71]: Counter({'blue': 3, 'green': 1, 'red': 2})

Counter内建方法分别为 elements() most_common() subtract()

elements

返回重复其计数的许多倍的每个元素的迭代器。按任意顺序返回元素。如果元素数小于 1, elements()将会忽略它。


In [132]: c = Counter(a=4, b=2, c=0, d=-2)

In [133]: list(c.elements())
Out[133]: ['a', 'a', 'a', 'a', 'b', 'b']

most_common

返回列表n最常见元素及从其计数最常见到最低限度。如果未指定n ,则most_common()将返回计数器中的所有元素。具有同等数量的元素是任意排序:


In [134]: Counter('abracadabra').most_common(3)
Out[134]: [('a', 5), ('r', 2), ('b', 2)]

In [135]: Counter('abracadabra').most_common(4)
Out[135]: [('a', 5), ('r', 2), ('b', 2), ('c', 1)]

subtract

元素减去可迭代或从另一个映射(或计数器)。像dict.update()但减去计数而不是取代他们。输入和输出可能为零或负。


In [136]: c = Counter(a=4, b=2, c=0, d=-2)

In [137]: d = Counter(a=1, b=2, c=3, d=4)

In [138]:  c.subtract(d)

In [139]: c
Out[139]: Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

deque

返回从左到右初始化的新的双向队列,是堆栈和队列的泛化。 支持线程安全,高效的内存追加。

支持以下方法

  • append()

  • appendleft()

  • clear()

  • count()

  • extend()

  • extendletf()

  • pop()

  • popleft()

  • remove() deque中的元素向右移动n个位置。如果n是负数的向左移动

  • reverse()

  • rotate()

  • maxlen()

除了以上所述,通过支持迭代、 pickling、 len(d)、 reversed(d)、 copy.copy(d)、 copy.deepcopy(d)、 检查成员用in运算符,和下标索引d [-1]。索引的访问两端都是 o (1),但在中间部分速度就减慢到 o (n)。对于快速的随机访问,改用列表。

通过方法即可知道作用,这里说下 rotate此方法


In [142]: d = deque('ghi')

In [143]: d.rotate(1)

In [144]: d
Out[144]: deque(['i', 'g', 'h'])

In [145]: d.rotate(-3)

In [146]: d
Out[146]: deque(['i', 'g', 'h'])

In [147]: d.rotate(-2)

In [148]: d
Out[148]: deque(['h', 'i', 'g'])

defaultdict

defaultdict是内置的dict类的一个子类。 它覆盖一个方法并添加一个可写的实例变量.

第一个参数提供了default_factory属性的初始值; 它默认为None。 所有其余的参数都被视为如果它们被传递给字典构造函数,包括关键字参数。

默认接受参数, 用来指定dict的value值的类型


In [161]: s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]

In [162]: d = defaultdict(list)

In [163]: for k, v in s:
     ...:     d[k].append(v)
     ...:

In [164]: d.items()
Out[164]: [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

In [173]: s = [('yellow', {'k': 1}), ('blue', {'v': 2}), ('red', {'p': 3})]

In [174]:

In [174]: for k, v in s:
     ...:     d[k] = v
     ...:

In [176]: d.items()
Out[176]: [('blue', {'v': 2}), ('red', {'p': 3}), ('yellow', {'k': 1})]

namedtuple

命名元组赋予元组中每个位置的含义,并允许更具可读性的自编写代码。 它们可以在任何使用常规元组的地方使用,并且可以通过名称而不是位置索引来添加字段


In [178]:  Point = namedtuple('Point', ['x', 'y'], verbose=True)

In [179]: p = Point(11, 22)

In [180]: p.x
Out[180]: 11

In [181]: p.y
Out[181]: 22

其本质仍是tuple数据结构, 继承tuple的方法,有兴趣可以阅读下源码,由于平常没有使用,没有好的场景使用举例,但是初步观察使用在 坐标、域名表示、cvs文件等,应该是比较好的使用场景。其实建议使用namedtuple, 避免使用下标进行索引。

Orderedict

有序的字典记得其插入顺序,可以使用与排序,以使已排序的字典.

目前还暂不明确使用场景。


In [226]: d
Out[226]: OrderedDict([('orange', 2), ('pear', 1), ('banana', 3), ('apple', 4)])

In [227]: b = dict({'banana': 3, 'apple':4, 'pear': 1, 'orange': 2})

In [229]: b
Out[229]: {'apple': 4, 'banana': 3, 'orange': 2, 'pear': 1}

In [230]: d
Out[230]: OrderedDict([('orange', 2), ('pear', 1), ('banana', 3), ('apple', 4)])

以上就是OrderedDict 与dict的对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值