Python. Как работать (именовать, инкриминировать) с повторяющимися переменными?
Есть потребность формирования словаря из XML, уже сделал. Тэги могут повторяться. Как красиво сделать названия переменных "со счетчиком" ? Пару вариантов оформления:
1) name_1, name_2 ...
2) name[1], name[2] ...
т.е. определить наличие переменной, вычислить есть ли у нее индекс, создать новую переменную с увеличенным индексом. Вручную муторно, возможно есть что-то элегантное, в одну- две строки ?
Ответы (3 шт):
Я наконец понял задачу, хоть мне и не кажется такой подход оптимальным, просто было интересно.
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)
Так как в комментах нет форматирования, создам Ответ. Пришел к выводу что буду работать через массивы а не уникальные имена. 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'}}
Ради форматирования новый Ответ. Из подобных файлов нужно сравнить порядка 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>