Easton's Blog Easton's Blog
首页
  • 编程语言

    • Python
  • 框架

    • Django
  • Mdn (opens new window)
  • HTML
  • CSS
  • JavaScript
  • Mysql
  • PostgreSQL
  • Elasticsearch
  • MongoDB
  • Redis
  • 服务器命令
  • Docker
  • GIT
  • 摄影
  • 草稿
  • 归类方式

    • 分类
    • 标签
    • 归档
  • 关于博客

    • 博客教程
    • 友情链接
    • 关于
导航站
GitHub (opens new window)

Easton Yang

爱生活😊爱学习
首页
  • 编程语言

    • Python
  • 框架

    • Django
  • Mdn (opens new window)
  • HTML
  • CSS
  • JavaScript
  • Mysql
  • PostgreSQL
  • Elasticsearch
  • MongoDB
  • Redis
  • 服务器命令
  • Docker
  • GIT
  • 摄影
  • 草稿
  • 归类方式

    • 分类
    • 标签
    • 归档
  • 关于博客

    • 博客教程
    • 友情链接
    • 关于
导航站
GitHub (opens new window)
  • Python

    • Python学习

      • 特殊方法
      • 常用内置函数
      • 数据类型
      • with用法
      • Python面向对象
      • re正则
      • 线程
      • 进程
      • 协程
      • 装饰器
      • 堆队列heapq
      • 容器collections
        • collections 模块
        • Counter
        • deque
        • defaultdict
        • namedtuple
        • OrderedDict
        • 容器的抽象基类
      • 内置异常
      • 枚举
      • 好玩的函数
    • 代码

    • 数据结构与算法

  • Django

  • 后端
  • Python
  • Python学习
eastonyangxu
2023-09-04
目录

容器collections

容器 python3.8 官网 (opens new window)

# collections 模块

from collections import Counter, deque, defaultdict, namedtuple, OrderedDict

# 这个模块实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择
1
2
3

# Counter

from collections import Counter

cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    cnt[word] += 1
print(cnt)  # Counter({'blue': 3, 'red': 2, 'green': 1})
print(cnt['black'])  # 0 ,key不存在 返回0

a = {}
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
    if not a.get(word):
        a[word] = 1
    else:
        a[word] += 1
print(a)  # {'red': 2, 'blue': 3, 'green': 1}

c = Counter(a=4, b=2, c=0, d=-2)
# 返回一个迭代器,其中每个元素将重复出现计数值所指定次。 元素会按首次出现的顺序返回。 如果一个元素的计数值小于一,elements() 将会忽略它
print(list(c.elements()))  # ['a', 'a', 'a', 'a', 'b', 'b']
#  most_common([n]) 返回一个列表,其中包含 n 个最常见的元素及出现次数,按常见程度由高到低排序
#  如果 n 被省略或为 None,most_common() 将返回计数器中的 所有 元素。 计数值相等的元素按首次出现的顺序排序
print(c.most_common())  # [('a', 4), ('b', 2), ('c', 0), ('d', -2)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# deque

from collections import deque

# class collections.deque([iterable[, maxlen]])
# 返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
# 虽然 list 对象也支持类似操作,不过这里优化了定长操作和 pop(0) 和 insert(0, v) 的开销。它们引起 O(n) 内存移动的操作,改变底层数据表达的大小和位置
# 如果 maxlen 没有指定或者是 None ,deques 可以增长到任意长度。否则,deque就限定到指定最大长度。
# 一旦限定长度的deque满了,当新项加入时,同样数量的项就从另一端弹出。
# 常用方法
d = deque(maxlen=3)
d.append(3)
d.append(2)
d.append(1)
d.append(4)  # 添加 4 到右端 ,达到最大值后,从另外一端弹出多余的
print(d)  # deque([2, 1, 4], maxlen=3)
d.appendleft(9)  # 添加9到最左端,达到最大值后,从另外一端弹出多余的
print(d)  # deque([9, 2, 1], maxlen=3)
print(d.count(0))  # 0,计算等于 0 的数量
# extend(iterable) , 扩展deque的右侧,通过添加iterable参数中的元素
# extendleft(iterable) , 扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加
# insert(i, x) ,在位置 i 插入 x ,如果插入会导致一个限长 deque 超出长度 maxlen 的话,就引发一个 IndexError
# pop() ,移去并且返回一个元素,deque 最右侧的那一个。 如果没有元素的话,就引发一个 IndexError
# popleft() ,移去并且返回一个元素,deque 最左侧的那一个。 如果没有元素的话,就引发 IndexError
# remove(value) ,移除找到的第一个 value。 如果没有的话就引发 ValueError
# reverse() ,将deque逆序排列。返回 None
# maxlen ,Deque的最大尺寸,如果没有限定的话就是 None
# clear() ,移除所有元素,使其长度为0
# copy() ,创建一份浅拷贝

# rotate(n=1) ,向右循环移动 n 步。 如果 n 是负数,就向左循环 ,
# 如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# defaultdict

from collections import defaultdict

# class collections.defaultdict([default_factory[, ...]])
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)
print(sorted(d.items()))  # [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1
print(sorted(d.items()))  # [('i', 4), ('m', 1), ('p', 2), ('s', 4)]
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# namedtuple

from collections import namedtuple

# namedtuple   命名元组的工厂函数
# collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
Point = namedtuple('Point', ['x', 'y'])
p = Point(11, y=22)
print(p[0] + p[1])  # 33
print(p.x + p.y)  # 33
x, y = p
print(x, y)  # 11 22
print(p)  # Point(x=11, y=22)

# 命名元组尤其有用于赋值 csv sqlite3 模块返回的元组
EmployeeRecord = namedtuple('EmployeeRecord', 'EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER')

import csv

for emp in map(EmployeeRecord._make, csv.reader(open("files/employees.csv", "r"))):
    print(emp.FIRST_NAME, emp.PHONE_NUMBER)

# 除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始
t = [9, 11]
p1 = Point._make(t)
print(p1)  # Point(x=9, y=11)
# 在 3.1 版更改: 返回一个 OrderedDict 而不是 dict ,在 3.8 版更改: 返回一个常规 dict 而不是 OrderedDict
print(p1._asdict())  # {'x': 9, 'y': 11} ,返回一个新的 dict ,它将字段名称映射到它们对应的值
print(p1._replace(x=33))  # Point(x=33, y=11) ,返回一个新的命名元组实例,并将指定域替换为新的值
print(p1._fields)  # ('x', 'y') ,字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型
print(getattr(p1, 'x'))  # 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# OrderedDict

from collections import OrderedDict

# OrderedDict  有序字典
# class collections.OrderedDict([items])  返回一个 dict 子类的实例,它具有专门用于重新排列字典顺序的方法
# 有序词典就像常规词典一样,但有一些与排序操作相关的额外功能

# popitem(last=True) 有序字典的 popitem() 方法移除并返回一个 (key, value) 键值对。
# 如果 last 值为真,则按 LIFO 后进先出的顺序返回键值对,否则就按 FIFO 先进先出的顺序返回键值对

# move_to_end(key, last=True) 将现有 key 移动到有序字典的任一端。 如果 last 为真值(默认)则将元素移至末尾;
# 如果 last 为假值则将元素移至开头。如果 key 不存在则会触发 KeyError

# 相对于通常的映射方法,有序字典还另外提供了逆序迭代的支持,通过 reversed()
# OrderedDict 之间的相等测试是顺序敏感的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 容器的抽象基类

# collections.abc --- 容器的抽象基类
# 该模块定义了一些 抽象基类,它们可用于判断一个具体类是否具有某一特定的接口;例如,这个类是否可哈希,或其是否为映射类

1
2
3
#Python
上次更新: 2023/09/04, 18:39:45
堆队列heapq
内置异常

← 堆队列heapq 内置异常→

最近更新
01
攻略制作要点
07-18
02
摄影主题拍摄
07-18
03
延时摄影剧本
07-18
更多文章>
Theme by Vdoing | Copyright © 2023-2024 Easton Yang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式