Python算法和数据结构(一)——collections模块
在这个分类里,我将给大家介绍 Python 的基础算法和数据结构,也会涉及到各样的面试知识
在面试过程中,可能面试官会提出问题:“你之前有用过 Python 哪些算法和数据结构呢?”当我们遇到这样的情况的时候应该怎么去回答呢?
首先我们揣测一下面试官的意图,他到底想问的是什么?我想到的是首先可以跟面试官讲一下 Python 内置的八大数据类型,然后由这些数据类型衍生出来的有哪些数据结构,最后一步是,当我们去运用这些数据结构的时候可以做哪些常见的算法。按照这个思路回答,也会有东西跟面试官聊,不至于不知所措。
重点:而且一旦涉及到数据类型,一定要想到 collections 库,collections是Python内建的一个集合模块,提供了许多有用的集合类。考官在问数据结构的时候也有极大的可能性是想知道面试者有没有用过 collections 库。
回答思路表格
1、八大数据类型
数据类型 | 英文 |
---|---|
数值 | number |
空值 | none |
布尔值 | bool |
字符串 | string |
列表 | list |
元组 | tuple |
集合 | set |
字典 | dictionary |
2、数据结构和算法(collections库)
数据结构/算法 | 语言内置 | 内置库 |
---|---|---|
线性结构 | list/tuple | array(数组,不常用) 、collections.namedtuple |
链式结构 | collections.deque(双端队列) | |
字典结构 | dict | collections.Counter(计数器)、OrderedDict(有序字典) |
集合结构 | set/frozen set | |
排序算法 | sorted | collections.deque(双端队列) |
二分算法 | bisect模块 | |
堆算法 | heapq模块 | |
缓存算法 | functools.Iru_cache(Least Recent Used,Python3) |
接下来本文重点讨论collections模块
可以先看一下一些方法的英文文档:
方法 | 英文文档 |
---|---|
namedtuple() | factory function for creating tuple subclasses with named fiields |
deque | list-like container with fast appends and pips on either end |
Counter | dict subclass for counting hashable objects |
OrderDict | dict subclass that remembers the order entries were added |
defaultDict | dict subclass that calls a factory function to supply missing values |
1、namedtuple
namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。
代码演示:
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
>>> p[0]
1
>>> p[1]
2
2、deque
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
代码演示:
In [1]: import collections
In [2]: de = collections.deque()
In [3]: de.append(1)
In [4]: de.appendleft(0)
In [5]: de
Out[5]: deque([0, 1])
In [6]: de.pop()
Out[6]: 1
In [7]: de.popleft()
Out[7]: 0
In [8]: de
Out[8]: deque([])
3、Counter
Counter是一个简单的计数器
代码演示:
In [9]: c = collections.Counter()
In [10]: c
Out[10]: Counter()
In [11]: c = collections.Counter('asdfdafsasfd')
In [12]: c
Out[12]: Counter({'a': 3, 's': 3, 'd': 3, 'f': 3})
In [13]: c['a']
Out[13]: 3
In [14]: c.most_common()
Out[14]: [('a', 3), ('s', 3), ('d', 3), ('f', 3)]
4、OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict
代码演示:
In [16]: od = collections.OrderedDict()
In [17]: od['c'] = 'c'
In [18]: od['a'] = 'a'
In [19]: od['b'] = 'b'
In [20]: od
Out[20]: OrderedDict([('c', 'c'), ('a', 'a'), ('b', 'b')])
In [21]: list(od.keys())
Out[21]: ['c', 'a', 'b']
5、defaultdict
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict
代码演示:
In [24]: dd = collections.defaultdict(int)
In [25]: dd['a']
Out[25]: 0
In [26]: dd['d'] += 1
In [27]: dd
Out[27]: defaultdict(int, {'a': 0, 'd': 1})
好啦,掌握这几个函数,就可以算是对 collections 库有基本的了解啦,我最近会把 Python 算法和数据结构这个专栏写完,请大家拭目以待吧~
嘿嘿,I am very glateful that 你看到这里了哦~下回再见ヾ(o◕∀◕)ノヾ
Thx