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
的具名元组类,它有两个字段 x
和 y
。然后我们使用该类创建了一个 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])