TypeError:当使用带字符串参数的itemgetter时,字符串索引必须是整数



我正在尝试使用IfcOpenShell实现IFC模型的分类。

在第一步中,我从IFC模型元素的列表中提取属性GlobalIdObjectType。然后,我想使用ObjectType属性对信息进行排序,以从模型接收以下信息:

Basiswand:Bestand 08.0:161894
{'GlobalId': '3vpWoB_K1EZ8RCaYmNGs6M', 'Element': 'Basiswand:Bestand 08.0:161894'}
{'GlobalId': '3vpWoB_K1EZ8RCaYmNGsB2', 'Element': 'Basiswand:Bestand 08.0:161894'}
Fenster 1-flg - Variabel
{'GlobalId': '3vpWoB_K1EZ8RCaYmNGssv', 'Element': 'Fenster 1-flg - Variabel'}
{'GlobalId': '3vpWoB_K1EZ8RCaYmNGsqI', 'Element': 'Fenster 1-flg - Variabel'}

具有相同ObjectType和不同GlobalId的元素应组合在一组中,以获得分类。

rows =[]   
buildingelement = model.by_type('IfcBuildingElement')
for buildingelement in model.by_type('IfcBuildingElement'):
rows.append(str(buildingelement.GlobalId) + ': ' + str(buildingelement.ObjectType))
print(rows)

from operator import itemgetter 
from itertools import groupby
# Sort by the desired field first
rows.sort(key=itemgetter('IfcBuildingElement'))
# Iterate in groups
for date, items in groupby(rows, key=itemgetter('IfcBuildingElement')): 
print(date)
for i in items: 
print(' ', i)

使用上面的代码,我得到了错误消息Exception has occurred: TypeError string indices must be integers

在第一个循环中,将rows的元素收集为'3vpWoB...: Basiswand...'形式的字符串。例如:

['3vpWoB_K1EZ8RCaYmNGs6M: Basiswand:Bestand 08.0:161894',
'3vpWoB_K1EZ8RCaYmNGsB2: Basiswand:Bestand 08.0:161894',
'3vpWoB_K1EZ8RCaYmNGssv: Fenster 1-flg - Variabel',
'3vpWoB_K1EZ8RCaYmNGsqI: Fenster 1-flg - Variabel'
]

然后,当使用itemgetter作为键函数进行排序和分组时,必须在字符串中指定一个位置或范围。例如,当您想根据第24个字符进行比较时,请使用itemgetter(24),或者类似地,根据后面的子字符串进行比较时使用itemgetter(slice(24,-1))

>>> '3vpWoB_K1EZ8RCaYmNGs6M: Basiswand:Bestand 08.0:161894'[24]
'B'
>>> '3vpWoB_K1EZ8RCaYmNGs6M: Basiswand:Bestand 08.0:161894'[24:-1]
'Basiswand:Bestand 08.0:161894'

如果您尝试使用字符串作为索引来获取子字符串,就像在itemgetter('IfcBuildingElement')中一样,您会看到错误。

>>> '3vpWoB_K1EZ8RCaYmNGs6M: Basiswand:Bestand 08.0:161894'['IfcBuildingElement']
TypeError: string indices must be integers 

因此,为了成功地使用itemgetter('Element')作为关键字进行排序和分组,您需要将行收集为表单的字典{'GlobalId': '3vpWoB...', 'Element': 'Basiswand...'}而不是字符串。例如:

[{'GlobalId':'3vpWoB_K1EZ8RCaYmNGs6M', 'Element':'Basiswand:Bestand 08.0:161894'},
{'GlobalId':'3vpWoB_K1EZ8RCaYmNGsB2', 'Element':'Basiswand:Bestand 08.0:161894'},
{'GlobalId':'3vpWoB_K1EZ8RCaYmNGssv', 'Element':'Fenster 1-flg - Variabel'},
{'GlobalId':'3vpWoB_K1EZ8RCaYmNGsqI', 'Element':'Fenster 1-flg - Variabel'}
]

这可以通过在循环中使用以下代码来收集行来实现。

rows.append({'GlobalId': buildingelement.GlobalId, 'Element': buildingelement.ObjectType})

相关内容

  • 没有找到相关文章

最新更新