TypeError: string indices must be integers when using itemgetter with string argument
TypeError: string indices must be integers when using itemgetter with string argument
我正在尝试使用 IfcOpenShell 实现 IFC 模型的分类。
在第一步中,我从 IFC 模型元素列表中提取属性 GlobalId
和 ObjectType
。然后我想使用 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})
我正在尝试使用 IfcOpenShell 实现 IFC 模型的分类。
在第一步中,我从 IFC 模型元素列表中提取属性 GlobalId
和 ObjectType
。然后我想使用 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})