You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中声明二维结构体数组?

嘿,在Python里其实没有像C++那样原生的「结构体」概念,但我们有几个非常好用的替代方案来实现类似功能,创建二维数组也很简单。我给你整理了几种最常用的方式:

1. 使用dataclasses(推荐,Python 3.7+)

这是最接近C++结构体的方案,支持类型提示,代码可读性高,还能轻松创建实例。

首先定义你的“结构体”类:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    score: float

然后创建二维数组(比如3行2列),用列表推导式就能搞定:

# 创建3行2列的二维结构体数组
rows = 3
cols = 2
two_d_struct_array = [[Person(f"Person_{i}_{j}", 20 + i, 85.5 + j) for j in range(cols)] for i in range(rows)]

# 访问其中一个元素
print(two_d_struct_array[1][0].name)  # 输出 Person_1_0
2. 使用collections.namedtuple(不可变结构体)

如果你需要的是不可修改的“结构体”,namedtuple是个不错的选择,它创建的实例是只读的,性能也很好。

from collections import namedtuple

# 定义结构体类型
Person = namedtuple('Person', ['name', 'age', 'score'])

# 创建二维数组
two_d_struct_array = [[Person(f"Person_{i}_{j}", 20 + i, 85.5 + j) for j in range(2)] for i in range(3)]

# 尝试修改会报错(因为namedtuple不可变)
# two_d_struct_array[0][0].age = 21  # AttributeError: can't set attribute
3. 使用普通字典(灵活无约束)

如果不需要类型提示,普通字典完全可以充当“结构体”,优点是极度灵活,不需要提前定义类型:

# 创建二维字典数组
two_d_struct_array = [[
    {"name": f"Person_{i}_{j}", "age": 20 + i, "score": 85.5 + j}
    for j in range(2)
] for i in range(3)]

# 访问元素
print(two_d_struct_array[0][1]['score'])  # 输出 86.5
额外补充:高性能数值场景用NumPy结构化数组

如果你的“结构体”里都是数值类型,且需要高性能计算,可以用NumPy的结构化数组:

import numpy as np

# 定义结构体 dtype
person_dtype = np.dtype([('name', 'U20'), ('age', 'i4'), ('score', 'f8')])

# 创建3行2列的二维结构化数组
two_d_struct_array = np.zeros((3, 2), dtype=person_dtype)

# 赋值
two_d_struct_array[0][0] = ("Alice", 22, 90.0)
two_d_struct_array[1][1] = ("Bob", 21, 88.5)

# 访问
print(two_d_struct_array[0][0]['name'])  # 输出 Alice

这些方法都能完美替代C++里的二维结构体数组,你可以根据自己的需求选择——需要类型安全和可读性选dataclass,需要不可变就用namedtuple,追求极致灵活用字典,数值计算场景选NumPy~

内容的提问来源于stack exchange,提问作者Ilyas Alo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:24:51