标准库 Collections 中 4 个常用的数据结构

开发 前端
collections 库是标准库的一部分,里面有很多数据结构,在列表、字典、元组的基础上做了很多修改和提升。

[[427289]]

collections 库是标准库的一部分,里面有很多数据结构,在列表、字典、元组的基础上做了很多修改和提升。

今天就来说说最有用的几个。

1、deque

它实现了两端都可以操作的队列,相当于双端队列,与可以指定最多存储多少个元素,与 Python 的基本数据类型列表很相似。

  1. from collections import deque 
  2.  
  3. a = deque(maxlen=3) 

上述代码定义了大小为 3 的双端队列,当你插入第 4 个元素时,队列的第一个元素会被删除。

  1. a = deque(maxlen=3) 
  2. a.append(1) # a = [1] 
  3. a.append(2) # a = [1, 2] 
  4. a.append(3) # a = [1, 2, 3] FULL 
  5. a.append(4) # a = [2,3,4] 

因为这是一个双端队列,你可以在队列的首位插入元素,也可以在首尾删除元素,它们的时间复杂度都是 O(1):

  • append(x) 在队列尾部插入 x
  • appendleft(x) 在队列头部插入 x
  • pop() 在队列尾部删除一个元素,并返回
  • popleft() 在队列头部删除一个元素,并返回
  1. a = deque(maxlen = 10) 
  2. a.append(1) # a = [1] 
  3. a.append(2) # a = [1, 2] 在队列尾部插入 2 
  4. a.appendleft(3)# a = [3, 1, 2] 在队列头部插入 3 
  5. x = a.pop() # a = [3, 1], x = 2 删除队列尾部元素 2 
  6. y = a.popleft() # a = [1], y = 3 删除队列头部元素 3 

2、namedtuple

这个库提供了命名的元组,可以通过指定的名称来访问,例如:

  1. from collections import namedtuple 
  2. Point = namedtuple("Point", ['x','y','z']) 
  3. p = Point(3,4,5) 
  4. print(p.x, p.y, p.z) #Output: 3, 4, 5 

namedtuple 函数把第一个参数作为新元组的名称,第二个参数就是元组内元素的名称映射,可以是一个字符串列表,也可以是空格或逗号分割的字符串。

  1. Point = namedtuple("Point""x y z"
  2. Point = namedtuple("Point""x,y,z"

也可以这样初始化,非常灵活:

  1. p1 = Point(3,4,5) 
  2. p2 = Point(x=3, y=4, z=5) 
  3. p3 = Point._make([3,4,5]) 

还可以使用 namedtuple 来设置默认值:

  1. PointDef = namedtuple("PointDef""x, y, z", defaults = [0,0,0]) 
  2. p = PointDef(x=1) # p is (1,0,0) 

如果你定义了三个名称,却提供了两个默认值,那么只有最后两个会被赋予默认值:

  1. Point = namedtuple("Point""x y z",defaults ="[0, 0]) 
  2. print(Point._field_defaults) 
  3. output: {“y”: 0, “z”: 0} 

3、Counter

计数器 Counter 非常有用,尤其当你需要统计列表或可迭代对象中元素的数量时:

  1. from collections import Counter 
  2. c = Counter(“aaabbccdaaa”) 
  3. print(c) 
  4. #Output: Counter({'a': 6, 'b': 2, 'c': 2, 'd': 1}) 

还可以方便的统计频率前几大,比如统计出现频率最高的两个元素:

  1. print(c.most_common(2)) 
  2. #output: [('a', 6), ('b', 2)] 

还可以动态增删字符串,然后统计:

  1. c = Counter("abbc") # {"a":1, "b":2, "c":1} 
  2. c.update("bccd") # {"a":1, "b":3, "c":3, "d":1} 
  3. c.subtract("bbc") # {"a":1, "b":1, "c":2, "d":1} 

4、defaultdict

defaultdict 和 dict 差不多,但是可以提供 dict 的 values 的默认数据类型,比如:

  1. from collections import defaultdict 
  2. toAdd =[("key1", 3), ("key2", 5), ("key3", 6), ("key2", 7)] 
  3. d = defaultdict(list) 
  4. for key, val in toAdd: 
  5.   d[key].append(val) 
  6. print(d) # {"key1":[3], "key2":[5, 7], "key3":[6]} 

如果你用 dict,可能要这样写:

  1. d = dict() 
  2. for key, val in toAdd: 
  3.   if key in d: 
  4.     d[key].append(val) 
  5.   else
  6.     d[key] = [val] 

或者是这样的:

  1. d = dict() 
  2. for key, val in toAdd: 
  3.   d.setdefault(key, []).append(val) 

 

总之,defaultdict 是简单和快捷的。

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2019-04-14 22:22:28

Python数据结构算法

2012-04-28 14:21:47

Java数据结构线性结构

2023-04-27 09:13:20

排序算法数据结构

2024-03-26 00:05:13

数据库数据结构

2014-07-01 15:49:33

数据结构

2021-01-06 08:03:00

JavaScript数据结构

2011-07-04 10:32:37

JAVA

2019-10-29 08:59:16

Redis底层数据

2020-08-02 23:04:20

python开发代码

2020-08-02 23:13:29

python开发数据结构

2024-08-20 00:00:05

2010-01-27 15:58:35

C++数据结构

2021-01-28 07:33:34

JavaScript链表数据

2019-09-18 08:31:47

数据结构设计

2024-10-11 16:43:05

高并发数据结构技巧

2011-03-31 15:41:51

Cacti数据表结构

2023-10-31 08:51:25

数据结构存储数据

2020-09-28 08:11:14

JavaScript数据

2023-07-03 17:24:33

数据结构

2014-12-10 10:35:43

微信 数据结构
点赞
收藏

51CTO技术栈公众号