如何访问Python嵌套字典深层的列表对象?
问题:访问嵌套字典中的列表对象
我有一个从XML转换而来的深层Python嵌套字典,包含嵌套在多层字典中的列表。需要访问名为Apparatus的列表对象,完成两个操作:
- A)统计当前列表元素数量,以便添加新元素;
- B)修改列表内字典中的部分项。
但始终无法找到正确语法直接访问该列表(后续还需对更深层的ApparatusPersonnel执行类似操作)。
以下是固定格式的字典结构(需反解析回XML,不可修改结构):
{ 'CadData': { 'EmsIncidentCollection': { 'EmsIncident': { 'AgencyNumber': '222222', 'ZoneNumber': '30'}}, 'FireIncidentCollection': { 'FireIncident': { 'AgencyNumber': '222222', 'Alarm': '2014-02-02T02:23:22-06:00', 'AlarmType': 'TypeofAlarm_SingleStation', 'ApartmentNumber': '4', 'ApparatusCollection': { 'Apparatus': [ { 'ApparatusPersonnelCollection': { 'ApparatusPersonnel': [ { 'FirstName': 'Jon', 'LastName': 'Snow', 'Level': 'PersonnelLevel_FirefighterI', 'LicenseNumber': '1234', 'Rank': 'Captain', 'Role': 'PersonnelRole_Driver', 'TimeIn': '2014-02-02T02:16:23-06:00', 'TimeOut': '2014-02-02T02:22:23-06:00'}, { 'LicenseNumber': '1138'}]}, 'Arrival': '2014-02-02T02:18:22-06:00', 'Clear': '2014-02-02T02:19:22-06:00', 'Dispatch': '2014-02-02T02:16:22-06:00', 'Enroute': '2014-02-02T02:17:22-06:00', 'InService': '2014-02-02T02:20:22-06:00', 'Number': 'AM22'}, { 'Number': 'EM11'}]}, 'Arrival': '2014-02-02T02:24:22-06:00', 'CadID': '0200222', 'CityName': 'Lakeville', 'Controlled': '2014-02-02T02:25:22-06:00', 'CountyName': 'Dakota', 'CrossStreet': None, 'District': None, 'Fdid': '123', 'InService': '2014-02-02T02:27:22-06:00', 'IncidentDate': '2014-02-02T02:21:22-06:00', 'IncidentNumber': '0200222', 'LastUnitCleared': '2014-02-02T02:26:22-06:00', 'Latitude': '44.6550598', 'Longitude': '-93.2710266', 'MixUseProperty': 'MixedUseProperty_IndustrialUse', 'Narrative': 'This ' 'is ' 'a ' 'test ' 'narrative.', 'Psap': '2014-02-02T02:22:22-06:00', 'Shift': 'A', 'StateName': 'MN', 'Station': 'Test ' 'Station', 'StreetName': 'Fake', 'StreetNumber': '123', 'StreetPrefix': 'N', 'StreetSuffix': 'N', 'StreetType': 'ST', 'ZipCode': '55044', 'ZoneNumber': '2B'}}}}
我尝试过以下方式访问列表:
for key in my_dict['CadData']['FireIncidentCollection']['FireIncident']['ApparatusCollection']: print(key) print(type(key)) print(len(key))
结果仅获取到字符串键名:
Apparatus <class 'str'> 9
遍历下一层得到的是列表中的字典元素,但无法直接获取列表本身:
for key in my_dict['CadData']['FireIncidentCollection']['FireIncident']['ApparatusCollection']['Apparatus']: print(key) print(type(key)) print(len(key))
{'Number': 'AM22', 'Dispatch': '2014-02-02T02:16:22-06:00', 'Enroute': '2014-02-02T02:17:22-06:00', 'Arrival': '2014-02-02T02:18:22-06:00', 'Clear': '2014-02-02T02:19:22-06:00', 'InService': '2014-02-02T02:20:22-06:00', 'ApparatusPersonnelCollection': {'ApparatusPersonnel': [{'LicenseNumber': '1234', 'Level': 'PersonnelLevel_FirefighterI', 'Role': 'PersonnelRole_Driver', 'FirstName': 'Jon', 'LastName': 'Snow', 'TimeIn': '2014-02-02T02:16:23-06:00', 'TimeOut': '2014-02-02T02:22:23-06:00', 'Rank': 'Captain'}, {'LicenseNumber': '1138'}]}} <class 'dict'> 7 {'Number': 'EM11'} <class 'dict'> 1
我希望:
- 获取
Apparatus列表的长度(示例中为2); - 通过索引直接访问列表元素并添加新元素;
- 确认直接通过已知键名访问是否为合理方式。
解决方案
1. 直接获取Apparatus列表对象
你之前的遍历操作是在迭代字典的键或列表的元素,而要直接操作列表本身,只需直接定位到该列表的路径:
# 定位到Apparatus列表 apparatus_list = my_dict['CadData']['FireIncidentCollection']['FireIncident']['ApparatusCollection']['Apparatus'] # 获取列表长度 print(len(apparatus_list)) # 输出:2
2. 操作A:统计数量与添加新元素
- 统计数量:用
len(apparatus_list)即可得到当前元素个数; - 添加新元素:直接使用列表的
append()方法(自动添加到末尾),无需手动计算索引:
# 定义新的设备字典 new_apparatus = { "Number": "ENG33", "Dispatch": "2014-02-02T02:25:22-06:00", # 其他必要字段... } # 添加到列表 apparatus_list.append(new_apparatus) # 此时列表长度变为3,新元素可通过apparatus_list[2]访问 print(len(apparatus_list)) # 输出:3
如果需要指定位置插入元素,可使用insert(index, element)方法,比如在第一个位置插入:apparatus_list.insert(0, new_apparatus)。
3. 操作B:修改列表内的字典项
直接通过索引定位到目标字典,然后修改对应键的值即可:
# 修改第一个设备的Number字段 apparatus_list[0]['Number'] = 'AM22_UPDATED' # 修改深层的ApparatusPersonnel信息(比如给第二个人员添加姓名) apparatus_list[0]['ApparatusPersonnelCollection']['ApparatusPersonnel'][1]['FirstName'] = 'Arya' apparatus_list[0]['ApparatusPersonnelCollection']['ApparatusPersonnel'][1]['LastName'] = 'Stark'
4. 关于直接用已知键名访问的合理性
在你的场景中(字典结构由XML转换而来,且需要反解析回XML,结构固定),直接通过已知键名访问是完全合理且高效的方式。因为XML转换后的字典结构是固定的,键名不会随意变化,直接访问能保证操作的准确性。
如果觉得路径太长太繁琐,可以用变量保存中间层的字典,简化代码:
# 保存中间层,减少重复路径书写 fire_incident = my_dict['CadData']['FireIncidentCollection']['FireIncident'] apparatus_list = fire_incident['ApparatusCollection']['Apparatus'] personnel_list = apparatus_list[0]['ApparatusPersonnelCollection']['ApparatusPersonnel'] # 后续操作直接用变量即可 personnel_list[1]['Rank'] = 'Lieutenant'
内容的提问来源于stack exchange,提问作者buckyswider
相关产品推荐
相关产品推荐

