如何在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
相关产品推荐
相关产品推荐

