Python. Как работать (именовать, инкриминировать) с повторяющимися переменными?

Есть потребность формирования словаря из XML, уже сделал. Тэги могут повторяться. Как красиво сделать названия переменных "со счетчиком" ? Пару вариантов оформления:

1) name_1, name_2 ...
2) name[1], name[2] ...

т.е. определить наличие переменной, вычислить есть ли у нее индекс, создать новую переменную с увеличенным индексом. Вручную муторно, возможно есть что-то элегантное, в одну- две строки ?


Ответы (3 шт):

Автор решения: Alexey Trukhanov

Я наконец понял задачу, хоть мне и не кажется такой подход оптимальным, просто было интересно.

name_list = ['Вася', 'Петя', 'Аня', 'Оля', 
             'Сережа', 'Вася', 'Петя', 'Аня', 
             'Оля', 'Сережа', 'Вася', 'Петя', 
             'Аня', 'Оля', 'Сережа', 'Вася', 
             'Петя', 'Аня', 'Оля', 'Сережа']

positions = len(str(len(name_list)))
d  = {f'name_{i+1:0{positions}}': name for i, name in enumerate(name_list)}
print(d)
→ Ссылка
Автор решения: Andy_bat

Так как в комментах нет форматирования, создам Ответ. Пришел к выводу что буду работать через массивы а не уникальные имена. DeepDiff срабатывает корректно

from deepdiff import DeepDiff

m={}
m['name'] = []
m['name'].append('Коля')
m['color']=[]
m['color'].append('red')
m['color'].append('green')
m['season']=[]
m['season'].append('winter')

n={}
n['name'] = []
n['name'].append('Оля')
n['name'].append('Вася')
n['color']=[]
n['color'].append('red')
n['season']=[]
n['season'].append('autumn')

print(DeepDiff(m, n))

Вывод:

{'values_changed': {"root['name'][0]": {'new_value': 'Оля', 'old_value': 'Коля'}, "root['season'][0]": {'new_value': 'othem', 'old_value': 'winter'}}, 'iterable_item_added': {"root['name'][1]": 'Вася'}, 'iterable_item_removed': {"root['color'][1]": 'green'}}
→ Ссылка
Автор решения: Andy_bat

Ради форматирования новый Ответ. Из подобных файлов нужно сравнить порядка 10 параметров разной степени вложенности. Тема поднималась из-за необходимости сравнения повторяющихся параметров "id_addr". Дата, время, ID не сравниваются. Описываю в качестве ответа почему не стал использовать DOM - сложно !

<ie prty="0" uie="P00151203_1577445318_0988_000e1">
<pasp>
    <inf>
        <ind t="wrd" v="Lg5=" id="7" proc_id="1" />
    </inf>
    <plc>
        <ch pid="0" lid="0" />
    </plc>
    <svc>
        <id_addr v="192.168.130.205" d="c" id="0" />
        <id_teid v="81b4022f" d="c" id="1" />
        <id_addr v="192.168.253.22" d="a" id="2" />
        <id_teid v="ebb6a9db" d="a" id="3" />
        <id_ip v="192.168.161.106" d="c" id="4" />
        <id_port v="59376" d="c" id="5" />
        <id_ip v="192.168.135.059" d="a" id="6" />
        <id_port v="00443" d="a" id="7" />
        <id_decoration_count id="8" v="1" />
    </svc>
</pasp>
<cont>
    <doc proc_id="1" id="1" s_tm="2019-12-27T11:15:18" s_tm_us="988" f_tm="2019-12-27T11:15:21" f_tm_us="609">
        <file>
            <inf t="mac.raw" d="c" />
        </file>
        <body fn="P00151203_1577445318_0988_000e1.001.mac.raw" s="29961" ext="1" />
    </doc>
</cont>
<proc res="0" id="1" s_tm="2023-12-11T12:55:24" f_tm="2023-12-11T12:55:24" method="TCP_COLLECTION" exec_t="P" exec="00" div="P" subdiv="00" prty="0" quality="100" />
<rel>
    <uie v="7b06776сс9550e0000" />
    <seq v="0" />
</rel>
→ Ссылка