Python Dictionary - Looping issue (nested) | TypeError: list indices must be integers or slices, not str
Python Dictionary - Looping issue (nested) | TypeError: list indices must be integers or slices, not str
我正在尝试遍历嵌套字典,但不断收到错误消息:列表索引必须是整数或切片,而不是字符串。
这是我尝试循环并使用 xmltodict 转换为字典的数据:
<Report ReportName="Dummy Data">
<Elements>
<DummyParameters>
<DummyParameter Name="User" />
</DummyParameters>
<InstanceElement Name="Instance 1" ID="1d2cd23f-1324-eb11-a2f4-00155d641104">
</InstanceElement>
<InstanceElement Name="Instance 2" ID="1d2cd23f-1324-eb11-a2f4-00155d641105">
</InstanceElement>
</Elements>
<Properties>
<DummyParameters>
<DummyParameter Name="User" Value="5914d71c-e0c7-e911-a2e0-00155d641201" />
</DummyParameters>
<InstanceElement Name="Instance 1" ID="1d2cd23f-1324-eb11-a2f4-00155d641104">
<InstanceProperty InstanceProperty="A" Value="Value_A" ID="1f2cd23f-1324-eb11-a2f4-00155d641104" />
<InstanceProperty InstanceProperty="B" Value="Value_B" ID="d214a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="C" ID="ec14a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="D" ID="de14a7b7-6b6f-ea11-a2eb-00155d641104" />
</InstanceElement>
<InstanceElement Name="Instance 2" CreatedBy="Test User 4" ID="1d2cd23f-1324-eb11-a2f4-00155d641105">
<InstanceProperty InstanceProperty="A" Value="Value_A" ID="2f2cd23f-1324-eb11-a2f4-00155d641104" />
<InstanceProperty InstanceProperty="B" Value="Value_B" ID="2214a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="C" CreatedBy="Test User" ID="2c14a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="D" CreatedBy="Test User" ID="2e14a7b7-6b6f-ea11-a2eb-00155d641104" />
</InstanceElement>
</Properties>
Ordered Dict Structure
和字典(尽可能简单)作为文本。
OrderedDict([('Report', OrderedDict([('@ReportName', 'Dummy Data'), ('Elements', OrderedDict([('DummyParameters', OrderedDict([('DummyParameter', OrderedDict([('@Name', 'User')]))])), ('InstanceElement', [OrderedDict([('@Name', 'Instance 1'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@Name', 'Instance 2'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641105')])])])), ('Properties', OrderedDict([('DummyParameters', OrderedDict([('DummyParameter', OrderedDict([('@Name', 'User'), ('@Value', '5914d71c-e0c7-e911-a2e0-00155d641201')]))])), ('InstanceElement', [OrderedDict([('@Name', 'Instance 1'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641104'), ('InstanceProperty', [OrderedDict([('@InstanceProperty', 'A'), ('@Value', 'Value_A'), ('@ID', '1f2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@InstanceProperty', 'B'), ('@Value', 'Value_B'), ('@ID', 'd214a7b7-6b6f-ea11-a2eb-00155d641104')])])]), OrderedDict([('@Name', 'Instance 2'), ('@CreatedBy', 'Test User 4'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641105'), ('InstanceProperty', [OrderedDict([('@InstanceProperty', 'A'), ('@Value', 'Value_A'), ('@ID', '2f2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@InstanceProperty', 'B'), ('@Value', 'Value_B'), ('@ID', '2214a7b7-6b6f-ea11-a2eb-00155d641104')])])])])]))]))])
我可以使用以下方法获取 属性 分支中的 InstanceElements 的 ID:
for item in data_dict["Report"]["Properties"]["InstanceElement"]:
ids['instance_id'] = [{value['@ID']} for value in data_dict["Report"]["Properties"]["InstanceElement"]]
然而,当我尝试遍历 InstanceProperty(更深一层)时,我只能通过索引访问它:
for item in data_dict["Report"]["Properties"]["InstanceElement"][0]["InstanceProperty"]:
print(item)
否则我会得到一个错误:TypeError:list indices must be integers or slice,not str。我想查看字典中的所有 InstanceProperty 项
我该怎么做?因为我正在尝试获取分配给其所有子项 (InstanceProperty) 的 InstanceElement 的 ID。
提前致谢!!
马克
data_dict["Report"]["Properties"]["InstanceElement"]
是一个列表,不是字典或 OrderedDict
。如果要打印所有 InstanceProperties
,可以使用嵌套循环遍历两个列表:
for element in data_dict["Report"]["Properties"]["InstanceElement"]:
for prop in element["InstanceProperty"]:
print(prop)
我正在尝试遍历嵌套字典,但不断收到错误消息:列表索引必须是整数或切片,而不是字符串。
这是我尝试循环并使用 xmltodict 转换为字典的数据:
<Report ReportName="Dummy Data">
<Elements>
<DummyParameters>
<DummyParameter Name="User" />
</DummyParameters>
<InstanceElement Name="Instance 1" ID="1d2cd23f-1324-eb11-a2f4-00155d641104">
</InstanceElement>
<InstanceElement Name="Instance 2" ID="1d2cd23f-1324-eb11-a2f4-00155d641105">
</InstanceElement>
</Elements>
<Properties>
<DummyParameters>
<DummyParameter Name="User" Value="5914d71c-e0c7-e911-a2e0-00155d641201" />
</DummyParameters>
<InstanceElement Name="Instance 1" ID="1d2cd23f-1324-eb11-a2f4-00155d641104">
<InstanceProperty InstanceProperty="A" Value="Value_A" ID="1f2cd23f-1324-eb11-a2f4-00155d641104" />
<InstanceProperty InstanceProperty="B" Value="Value_B" ID="d214a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="C" ID="ec14a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="D" ID="de14a7b7-6b6f-ea11-a2eb-00155d641104" />
</InstanceElement>
<InstanceElement Name="Instance 2" CreatedBy="Test User 4" ID="1d2cd23f-1324-eb11-a2f4-00155d641105">
<InstanceProperty InstanceProperty="A" Value="Value_A" ID="2f2cd23f-1324-eb11-a2f4-00155d641104" />
<InstanceProperty InstanceProperty="B" Value="Value_B" ID="2214a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="C" CreatedBy="Test User" ID="2c14a7b7-6b6f-ea11-a2eb-00155d641104" />
<InstanceProperty InstanceProperty="D" CreatedBy="Test User" ID="2e14a7b7-6b6f-ea11-a2eb-00155d641104" />
</InstanceElement>
</Properties>
Ordered Dict Structure
和字典(尽可能简单)作为文本。
OrderedDict([('Report', OrderedDict([('@ReportName', 'Dummy Data'), ('Elements', OrderedDict([('DummyParameters', OrderedDict([('DummyParameter', OrderedDict([('@Name', 'User')]))])), ('InstanceElement', [OrderedDict([('@Name', 'Instance 1'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@Name', 'Instance 2'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641105')])])])), ('Properties', OrderedDict([('DummyParameters', OrderedDict([('DummyParameter', OrderedDict([('@Name', 'User'), ('@Value', '5914d71c-e0c7-e911-a2e0-00155d641201')]))])), ('InstanceElement', [OrderedDict([('@Name', 'Instance 1'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641104'), ('InstanceProperty', [OrderedDict([('@InstanceProperty', 'A'), ('@Value', 'Value_A'), ('@ID', '1f2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@InstanceProperty', 'B'), ('@Value', 'Value_B'), ('@ID', 'd214a7b7-6b6f-ea11-a2eb-00155d641104')])])]), OrderedDict([('@Name', 'Instance 2'), ('@CreatedBy', 'Test User 4'), ('@ID', '1d2cd23f-1324-eb11-a2f4-00155d641105'), ('InstanceProperty', [OrderedDict([('@InstanceProperty', 'A'), ('@Value', 'Value_A'), ('@ID', '2f2cd23f-1324-eb11-a2f4-00155d641104')]), OrderedDict([('@InstanceProperty', 'B'), ('@Value', 'Value_B'), ('@ID', '2214a7b7-6b6f-ea11-a2eb-00155d641104')])])])])]))]))])
我可以使用以下方法获取 属性 分支中的 InstanceElements 的 ID:
for item in data_dict["Report"]["Properties"]["InstanceElement"]:
ids['instance_id'] = [{value['@ID']} for value in data_dict["Report"]["Properties"]["InstanceElement"]]
然而,当我尝试遍历 InstanceProperty(更深一层)时,我只能通过索引访问它:
for item in data_dict["Report"]["Properties"]["InstanceElement"][0]["InstanceProperty"]:
print(item)
否则我会得到一个错误:TypeError:list indices must be integers or slice,not str。我想查看字典中的所有 InstanceProperty 项
我该怎么做?因为我正在尝试获取分配给其所有子项 (InstanceProperty) 的 InstanceElement 的 ID。
提前致谢!!
马克
data_dict["Report"]["Properties"]["InstanceElement"]
是一个列表,不是字典或 OrderedDict
。如果要打印所有 InstanceProperties
,可以使用嵌套循环遍历两个列表:
for element in data_dict["Report"]["Properties"]["InstanceElement"]:
for prop in element["InstanceProperty"]:
print(prop)