You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问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

我希望:

  1. 获取Apparatus列表的长度(示例中为2);
  2. 通过索引直接访问列表元素并添加新元素;
  3. 确认直接通过已知键名访问是否为合理方式。

解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:15:42