Создать структуру данных из списков

Имеется список списков

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]]'}]
 }}
→ Ссылка