Создать структуру данных из списков
Имеется список списков
l = [
['Трава', 'label1', 'point', '[285, 78]'],
['Трава', 'label2', 'rectangle', '[[219, 41], [312, 95]]'],
['Асфальт', 'label1', 'rectangle', '[[385, 331], [418, 372]]']
]
Первые элементы списков могут повторяться, как в этом случае, где трава.
Нужно из этого создать следующую структуру:
{'img_name':'file_name',
'classes':{
'Трава':[{'label_name':'label1',
'figure':'point',
'all_x':['285'],
'all_y':['78']},
{'label_name': 'label1',
'figure': 'rectangle',
'all_x': ['219','312'],
'all_y': ['41','95']}
],
'Асфальт':[
{'label_name': 'label2',
'figure': 'rectangle',
'all_x': ['385', '418'],
'all_y': ['331', '372']}
]}
}
Как это сделать правильно, подскажите, пожалуйста
Ответы (2 шт):
Автор решения: Newman
→ Ссылка
Собственно,вот
get_classes=[]
for i in l:
get_classes.append(i[0])
dic={}
for c in set(get_classes):
dic[c]=[]
def all_x_y(fig,coords):
to_lst = list(eval(coords))
if fig=='point':
return [[to_lst[0]],[to_lst[1]]]
else:
all_x=[]
all_y=[]
for t in to_lst:
all_x.append(t[0])
all_y.append(t[1])
return all_x,all_y
for i in l:
if i[0] in dic:
dic[i[0]].append({
'label_name':i[1],
'figure':i[2],
'all_x':all_x_y(i[2],i[3])[0],
'all_y':all_x_y(i[2],i[3])[1]
})
d = {'img_name':'img.png',
'classes':dic
}
Автор решения: passant
→ Ссылка
Мне кажется, у меня получилось чуть проще:
main_dict=dict()
uniq=set([l1[0] for l1 in l])
for kl in uniq:
lt=[]
for l1 in l:
if l1[0]==kl:
lt.append(dict(zip(keys, l1[1:])))
main_dict[kl]=lt
d = {'img_name':'img.png',
'classes':main_dict
}
print (d)
Результат:
{'img_name': 'img.png',
'classes':
{'Трава':
[{'name': 'label1', 'label_name': 'point', 'figure': '[285, 78]'},
{'name': 'label2', 'label_name': 'rectangle', 'figure': '[[219, 41], [312, 95]]'}],
'Асфальт':
[{'name': 'label1', 'label_name': 'rectangle', 'figure': '[[385, 331], [418, 372]]'}]
}}