Преобразование списка строк в словарь
Имеется список вида:
['object1 Atr1 Atr2 Atr3', 'object2 Atr1 Atr2', 'object3 Atr1', 'object4 Atr1 Atr2 Atr3 Atr4']
В котором сохранены строки с описанием некоторого объекта. С начала строки до первого пробела - имя объекта, и далее через пробел, список его атрибутов. Aтрибутов может быть произвольное количество, разделенных также пробелом. Данный список мне необходимо преобразовать в словарь вида:
{'object1': ['Atr1', 'Atr2', 'Atr3'], 'object2': ['Atr1', 'Atr2'], 'object3': ['Atr1'], 'object4': ['Atr1', 'Atr2']}
Решаю задачу таким образом:
data = ["object1 Atr1 Atr2 Atr3", "object2 Atr1 Atr2", "object3 Atr1", "object4 Atr1 Atr2 Atr3 Atr4", "object4 Atr1 Atr2"]
for i in range(len(data)): # каждую строку в списке преобразую в отдельный список
data[i] = list(map(str, data[i].split(' ')))
my_dict= {}
for i in range(len(data)): # записываю в качестве ключа первый элемент каждого списка и остальное в отдельный список
my_dict[data[i][0]] = list(data[i][1:])
Чисто технически мой код работает, но понимаю, что наворотил велосипед и это можно сделать элегантнее.
Подскажите, как можно улучшить?
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
исходные данные:
data = [
'object1 Atr1 Atr2 Atr3',
'object2 Atr1 Atr2',
'object3 Atr1',
'object4 Atr1 Atr2 Atr3 Atr4'
]
используем dict comprehension:
res = {s.split()[0]:s.split()[1:] for s in data}
или обычный цикл (в данном случае s.split() вызывается только один раз):
res = {}
for s in data:
tmp = s.split()
res[tmp[0]] = tmp[1:]
для Python 3.8+ можно использовать walrus operator:
res = {tmp[0]:tmp[1:] for s in data if (tmp := s.split())}
# NOTE: ---------------------------> ^^^^^^^^^^^^^^^^^^
результат:
In [81]: res
Out[81]:
{'object1': ['Atr1', 'Atr2', 'Atr3'],
'object2': ['Atr1', 'Atr2'],
'object3': ['Atr1'],
'object4': ['Atr1', 'Atr2', 'Atr3', 'Atr4']}