Как преобразовать список списка в структурированный dict, Python3 - PullRequest
0 голосов
/ 28 октября 2018

У меня есть список списка, содержимое которого следует прочитать и сохранить в структурированном словаре.

my_list = [
    ['1', 'a1', 'b1'],
    ['',  'a2', 'b2'],
    ['',  'a3', 'b3'],
    ['2', 'c1', 'd1'],
    ['',  'c2', 'd2']]

1-й, 2-й, 3-й столбцы в каждой строке представляют 'id', 'attr1', 'attr2'.Если 'id' в строке не пусто, новый объект начинается с этого 'id'.В приведенном выше примере есть два объекта.Объект с 'id', являющимся '1', имеет 3 элемента как 'attr1', так и 'attr2';в то время как объект с 'id', являющимся '2', имеет 2 элемента: 'attr1' и 'attr2'.В моем реальном приложении может быть больше объектов, и каждый объект может иметь произвольное количество элементов.

Для этого конкретного примера результат должен быть

my_dict = {
    'id': ['1', '2'],
    'attr1': [['a1', 'a2', 'a3'], ['c1', 'c2']]
    'attr2': [['b1', 'b2', 'b3'], ['d1', 'd2']]

Не могли бы вы показатьКак написать общий и эффективный код для его достижения?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вот одно решение, использующее collections.defaultdict:

from collections import defaultdict

dd = defaultdict(lambda: defaultdict(list))

for num, attr1, attr2 in my_list:
    if num:
        current_id = num
    dd[current_id]['attr1'].append(attr1)
    dd[current_id]['attr2'].append(attr2)

# defaultdict(<function __main__.<lambda>()>,
#             {'1': defaultdict(list,
#                          {'attr1': ['a1', 'a2', 'a3'],
#                           'attr2': ['b1', 'b2', 'b3']}),
#              '2': defaultdict(list,
#                          {'attr1': ['c1', 'c2'], 'attr2': ['d1', 'd2']})})

attr1, attr2 = ([v[i] for v in dd.values()] for i in ('attr1', 'attr2'))

res = {'id': list(dd), 'attr1': attr1, 'attr2': attr2}

print(res)

{'id': ['1', '2'],
 'attr1': [['a1', 'a2', 'a3'], ['c1', 'c2']],
 'attr2': [['b1', 'b2', 'b3'], ['d1', 'd2']]}
0 голосов
/ 28 октября 2018

Просто соберите соответствующий dict в цикле с правильными условиями:

d = {f: [] for f in ('id', 'attr1', 'attr2')}

for id, attr1, attr2 in my_list:
    if id:
        d['id'].append(id)
        d['attr1'].append([])
        d['attr2'].append([])
    d['attr1'][-1].append(attr1)
    d['attr2'][-1].append(attr2)
0 голосов
/ 28 октября 2018
for i in my_list:
    if i[0] is not "":
        my_dict["id"].append(i[0])
        my_dict["attr1"].append([i[1]])
        my_dict["attr2"].append([i[2]])
    else:
        my_dict["attr1"][-1].append(i[1])
        my_dict["attr2"][-1].append(i[2])

Не очень красивый код, может быть немного более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...