namedtuple 与 OrderedDict
其他实用集合
namedtuple 与 OrderedDict 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
另外两个实用集合
collections 模块包含用于创建可读的类记录元组的 namedtuple,以及提供额外顺序操作方法的 OrderedDict。
请使用 from collections import namedtuple, OrderedDict 导入它们。
from collections import namedtuple, OrderedDict
print(namedtuple)
print(OrderedDict)定义命名元组
namedtuple(name, fields) 会创建一个新的元组子类。您需要传入类型名称和字段名称列表。结果是一个可以实例化的类。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p)按名称访问
主要优势是:您可以按名称读取字段,而不是使用难以理解的索引编号,这会让代码的可读性大幅提升。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p.x)
print(p.y)仍然是元组
命名元组是真正的元组,因此索引、解包和迭代仍然有效。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
print(p[0])
x, y = p
print(x + y)不可变但可替换
与所有元组一样,命名元组不可变。若要获取修改后的副本,请使用 ._replace(),它会返回一个新实例。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 4)
q = p._replace(y=10)
print(p)
print(q)转换为字典
._asdict() 会将命名元组转换为普通字典,将字段名称映射到对应的值。
from collections import namedtuple
Car = namedtuple('Car', ['make', 'year'])
c = Car('Toyota', 2026)
print(c._asdict())默认值
定义命名元组时提供 defaults。默认值会应用于最右侧的字段,因此创建实例时可以省略这些字段。
from collections import namedtuple
User = namedtuple('User', ['name', 'role'], defaults=['guest'])
print(User('Alice'))
print(User('Bob', 'admin'))检查字段
._fields 属性会列出字段名称,对于自省或构建通用代码很有用。
from collections import namedtuple
Color = namedtuple('Color', ['r', 'g', 'b'])
print(Color._fields)OrderedDict 基础
OrderedDict 会记住插入顺序。Python 3.7 及更高版本中的普通字典也会保持顺序,但 OrderedDict 还提供额外的顺序相关方法,这是其他方式无法获得的。
from collections import OrderedDict
od = OrderedDict()
od['first'] = 1
od['second'] = 2
print(od)move_to_end
.move_to_end(key) 会将一个键移到末尾(使用 last=False 时移到开头)。这是 OrderedDict 独有的功能,适合实现 LRU 风格的逻辑。
from collections import OrderedDict
od = OrderedDict(a=1, b=2, c=3)
od.move_to_end('a')
print(list(od.keys()))
od.move_to_end('c', last=False)
print(list(od.keys()))顺序相关的相等性
两个 OrderedDict 对象只有在其中的元素顺序相同时才相等。普通字典在比较时会忽略顺序。
from collections import OrderedDict
a = OrderedDict([('x', 1), ('y', 2)])
b = OrderedDict([('y', 2), ('x', 1)])
print(a == b)
print(dict(a) == dict(b))快速检查
由于命名元组不可变,如何创建它的修改副本?
回顾:命名元组与 OrderedDict
总结:
namedtuple(name, fields)会创建支持按名称访问的可读、不可变记录。- 使用
._replace()创建修改后的副本,使用._asdict()将其转换为字典。 OrderedDict会保留插入顺序,并添加.move_to_end()。- OrderedDict 的相等性与顺序有关,而普通字典不是这样。
from collections import namedtuple
Pt = namedtuple('Pt', ['x', 'y'])
print(Pt(1, 2)._asdict())常见问题解答
「namedtuple 与 OrderedDict」课时是免费的吗?
是的 — 「namedtuple 与 OrderedDict」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「namedtuple 与 OrderedDict」这节课中我会学到什么?
其他实用集合 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「namedtuple 与 OrderedDict」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Counter
- defaultdict
- deque
- namedtuple 与 OrderedDict