python编写五子棋小游戏 (collection库讲解 2)

文章介绍了Python的collections模块中的三个重要数据结构:OrderedDict能记住元素添加顺序,Namedtuple允许通过名称访问元组元素,Deque是高效双向队列,支持在两端快速添加和删除元素。
摘要由CSDN通过智能技术生成

OrderedDict

collections 模块中的一个类,它是字典类 dict 的一个子类。和普通的 dict 不同,OrderedDict 可以记住字典中元素的添加顺序,而不是按照键的默认顺序排序。

使用 OrderedDict 创建字典和普通的 dict 是一样的。我们可以通过传递一个包含键值对的可迭代对象来创建 OrderedDict 对象,也可以通过字典推导式来创建。

from collections import OrderedDict

# 通过可迭代对象创建 OrderedDict
od1 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od1)  # 输出 OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# 通过字典推导式创建 OrderedDict
od2 = OrderedDict({('a', 1), ('b', 2), ('c', 3)})
print(od2)  # 输出 OrderedDict([('c', 3), ('a', 1), ('b', 2)])

输出结果可以看到,OrderedDict 会记住元素添加的顺序。例如,od1 中元素的顺序和添加顺序是一样的,而 od2 中元素的顺序和添加顺序是不一样的,这是因为字典是无序的,而 OrderedDict 记住了元素添加的顺序。

OrderedDict 和普通的 dict 一样,支持所有 dict 对象的操作,例如添加元素、删除元素、修改元素等等。另外,OrderedDict 还提供了一些其他的方法,例如 move_to_end() 方法,用于移动一个键值对到字典的头部或尾部。例如:

# 添加元素
od1['d'] = 4
od1['e'] = 5

# 删除元素
del od1['a']

# 修改元素
od1['b'] = 20

# move_to_end() 方法
od1.move_to_end('c', last=False)
print(od1)  # 输出 OrderedDict([('c', 3), ('b', 20), ('d', 4), ('e', 5)])

从输出结果可以看到,使用 move_to_end() 方法可以将一个键值对移动到字典的头部或尾部,这个方法有一个可选参数 last,默认为 True,表示将键值对移动到字典的尾部;如果将 last 设置为 False,则表示将键值对移动到字典的头部。

Namedtuple

这个函数返回一个新的元组子类,它允许访问元组中的元素使用名称而不是索引。由Colloctions模块提供的一个工厂函数,它用于创建具名元组(named tuple)。具名元组是普通元组的子类,它的每个字段都有一个名称,并且可以像访问对象属性一样访问这些字段,不需要使用索引。

from collections import namedtuple

# 创建一个名为 Point 的具名元组类,包含两个字段 x 和 y
Point = namedtuple('Point', ['x', 'y'])

# 创建一个 Point 对象
p = Point(1, 2)

# 访问 Point 对象的字段
print(p.x)  # 输出 1
print(p.y)  # 输出 2

 

在上面的代码中,我们首先通过调用 namedtuple 函数创建了一个名为 Point 的具名元组类,它有两个字段 xy。然后我们使用该类创建了一个 Point 对象,并可以像访问对象属性一样访问它的字段。

具名元组类在创建时需要指定两个参数:类名和字段名列表。其中,类名是一个字符串,用于指定创建的具名元组类的名称;字段名列表是一个包含所有字段名的可迭代对象,用于指定具名元组的字段。字段名列表可以是一个字符串列表、元组、集合或其他任何可迭代对象。

namedtuple 函数有两个必需的参数:元组名称和字段列表。元组名称是一个字符串,表示元组的名称,字段列表是一个由字符串组成的列表,每个字符串表示元组中的一个字段。

from collections import namedtuple

# 创建一个名为 Point 的 namedtuple,它有 x, y, z 三个字段
Point = namedtuple('Point', ['x', 'y', 'z'])

# 创建一个具有特定字段的 Point 元组
p = Point(1, 2, 3)

# 访问元组中的字段
print(p.x)  # 输出 1
print(p.y)  # 输出 2
print(p.z)  # 输出 3

可以看到,我们使用 namedtuple 函数定义了一个名为 Point 的元组类型,并指定了三个字段 x、y、z。然后,我们可以使用 Point 函数来创建具有特定字段的元组。通过使用点号访问元组中的字段,我们可以方便地访问每个字段的值。

此外,具名元组还提供了一些实用方法,如 _asdict()_replace()_fields 等,可以方便地转换为字典、替换字段值、获取字段名列表等。

from collections import namedtuple

# 创建一个具名元组
Point = namedtuple('Point', ['x', 'y'])

# 创建一个具名元组的实例
p = Point(1, 2)

# 访问元组中的元素
print(p.x)  # 输出:1
print(p.y)  # 输出:2

# 将元组转换为字典
print(p._asdict())  # 输出:{'x': 1, 'y': 2}

# 替换元组中的某个元素
p = p._replace(x=3)
print(p)  # 输出:Point(x=3, y=2)

# 获取元组中的字段列表
print(Point._fields)  # 输出:('x', 'y')

Deque

deque 是 Python 中的一个数据类型,是一个双向队列(Double Ended Queue),也称为双端队列。与普通列表(list)相比,deque 可以在两端高效地添加或删除元素,因为它实现了高效的头尾操作,而不需要移动整个序列。deque 是线程安全的,支持多线程并发操作,是一个高效的数据结构,特别适合用于队列、栈、轮询等应用场景。

deque 函数返回的是一个可变的、有序的序列类型,类似于列表(list),但是支持在队列的两端高效地添加或删除元素,具有 O(1) 复杂度。同时,deque 还支持线程安全、内存优化等特性。

下面是一些 deque 的常用方法:

  • append(x):将元素 x 添加到 deque 的右端。

  • appendleft(x):将元素 x 添加到 deque 的左端。

  • clear():清空 deque 中的元素。

  • copy():返回一个 deque 的浅复制。

  • count(x):返回 deque 中元素 x 的数量。

  • extend(iterable):在 deque 的右侧追加一个可迭代对象中的所有元素。

  • extendleft(iterable):在 deque 的左侧追加一个可迭代对象中的所有元素,注意元素的顺序。

  • index(x[, start[, stop]]):返回第一个等于 x 的元素的索引,如果没有找到则抛出 ValueError 异常。

  • insert(i, x):在 deque 的第 i 个位置插入元素 x。

  • pop():移除并返回 deque 中的最右侧元素,如果 deque 为空则抛出 IndexError 异常。

  • popleft():移除并返回 deque 中的最左侧元素,如果 deque 为空则抛出 IndexError 异常。

  • remove(value):移除第一个等于 value 的元素,如果没有找到则抛出 ValueError 异常。

  • reverse():将 deque 中的元素反转。

  • rotate(n):将 deque 向右旋转 n 步。当 n 是负数时,向左旋转。

代码展示:

from collections import deque

# 创建一个 deque 对象
d = deque([1, 2, 3, 4])

# 在右侧添加元素
d.append(5)

# 在左侧添加元素
d.appendleft(0)

# 在右侧扩展元素
d.extend([6, 7, 8])

# 在左侧扩展元素
d.extendleft([-1, -2, -3])

# 移除最右侧元素
d.pop()

# 移除最左侧元素
d.popleft()

# 反转 deque 中的元素
d.reverse()

# 输出 deque 中的元素
print(d)  # deque([8, 7, 6, 4, 3, 2, 1])

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值