Проблема с циклом в словаре Python (вложенный) | Ошибка типа: индексы списка должны быть целыми числами или фрагментами, а не str

#python #loops #ordereddictionary #xmltodict

#python #циклы #ordereddictionary #xmltodict

Вопрос:

Я пытаюсь перебрать вложенный словарь, но продолжаю получать ошибку: индексы списка должны быть целыми числами или фрагментами, а не 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>
 

Упорядоченная структура Dict

И dict (как можно проще) в виде текста.

 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 в ветке свойств, используя это:

 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: индексы списка должны быть целыми или фрагментами, а не str. И я хотел бы просмотреть все элементы InstanceProperty в словаре

Как мне это сделать? Поскольку я пытаюсь получить идентификатор InstanceElement, присвоенный всем его дочерним элементам (InstanceProperty).

Заранее спасибо!!

Отметьте

Ответ №1:

data_dict["Report"]["Properties"]["InstanceElement"] это список, а не dict или an OrderedDict . Если вы хотите распечатать все InstanceProperties , вы можете использовать вложенный цикл для просмотра обоих списков:

 for element in data_dict["Report"]["Properties"]["InstanceElement"]:
    for prop in element["InstanceProperty"]:
        print(prop)