是否有一种方法可以通过创建数据类条目进行循环?



我有一个存储有关光束信息的数据类。我在一个。csv文件中有关于光束的信息,我正在将其读入字典。

然后我想将存储在字典中的信息读入数据类。我想循环这个,以便在每次循环迭代时创建一个新的数据类,其名称当前存储在字典中,并且数据类填充当前存储在字典中的数据。

我dataclass:

@dataclass
class FrameElement:
# attributes to be passed in to define specific instance
label: str # name
orient: str # element orientation
A: float # cross-sectional area
E: float # young's modulus
I: float # second moment of area / moment of inertia
Qfef: float # element fixed end forces (local coord.)
node1: float # [x-coord., y-coord., x-map., y-map., m-map.]
node2: float # "

我试图用来循环创建数据类的代码:

for i in range(nelem):
i += 1
name = 'elem%d'%i

[label, orient, A, E, I, Qfef, node1_str, node2_str, node1_ary, node2_ary] = elem_dict[name]

'elem%d'%i = FrameElement(label, orient, A, E, I, Qfef, node1_ary, node2_ary)

我尝试使用'elem%d'% I来创建数据类条目的名称,然后用字典中存储的信息填充它。这会返回以下错误:

File "<ipython-input-23-ff5da982294c>", line 7
'elem%d'%i = FrameElement(label, orient, A, E, I, Qfef, node1_ary, node2_ary)
^
SyntaxError: cannot assign to operator

如果您有一个存储数据的字典,那么您可以简单地创建数据类:

my_dict = {} # that's your source data
dataclass_dict = {}  # output dictionary with dataclasses as values
for k, v in my_dict.items():
dataclass_dict[k] = FrameElement(*v)

这当然是非常危险的,并且依赖于源数据中所有值将保持其在数组中的位置。

一个更好的解决方案是将源数据作为字典的字典,其中第一个字典将键作为元素的名称,其值将是元素属性的字典,如下所示:

dict_el = {
'element_1': {
'label': 'Foo',
'orient': '',
...
}
}

然后你可以按照上面的方法做,但是更有信心你不会有问题:

dataclass_dict = {k: FrameElement(**v) for k, v in dict_el.items()}

我是这样创建变量名的:

myElements = []
for i in range(nelem):
i += 1
name = 'elem%d'%i

[label, orient, A, E, I, Qfef, node1_str, node2_str, node1_ary, node2_ary] = elem_dict[name]

locals()[name] = FrameElement(label, orient, A, E, I, Qfef, node1_ary, node2_ary)

myElements.append(name)

print(myElements)

最新更新