Превратить список в словарь в Python - PullRequest
0 голосов
/ 09 мая 2019

Я новичок в python и испытываю трудности с преобразованием некоторых типов данных.У меня есть список объектов, которые имеют много атрибутов, и я хочу создать лучшую структуру для них.old_list основан на типах 'Var', которые выглядят следующим образом:

old_type.name='a_1_1'
old_type.value=3.0

Количество индексов и тип значения могут измениться:

[old_type('a_1_1',4),old_type('a_1_2',2),old_type('x_1',True)]

Я бы хотелразбить старое имя на буквы и цифры и создать new_data_structure, который будет выглядеть идеально так:

new_data_structure[0].letter = 'a'
new_data_structure[0].indices= [1,1]
new_data_structure[0].value = 4

new_data_structure[2].letter = 'x'
new_data_structure[2].indices= 1
new_data_structure[2].value  = True

, и я трачу довольно много времени, но не могу заставить его работать.я попытался

 new_list= [[old_type[i].name.split('_'), \
                     old_type[i].vartype.value] for i in range(len(old_type))]

, который создает странные глубокие списки (new_list[0][0][0] для «а»), а также только с индексами.я пытался диктовать с помощью

new_dict = {'letter': old_type[i].name.split('_'),  'value',old_type[i].value for i in range(len(old_type))}

, но здесь for, кажется, не зацикливается на ключевых словах, разделенных запятой, и вставка for между каждой запятой тоже не работает.

Затем я попытался явно перебрать различные ключи

for i in range(len(old_type)):
    new_dict[i][letter] = old_type[i].name.split('_')
    new_dict[i][value] = old_type[i].value

, но каждый раз это перезаписывает и оставляет только последнюю букву и значение в new_dict.Я чувствую, что делаю так сложнее, чем должно быть.

Итого: есть ли способ преобразовать атрибуты списка объектов в диктет (список диктов?) С ключевыми словами в качестве указанных атрибутов?

Дополнительный вопрос: не существует личто-то вроде substr('_') i Python, который может возвращать только строковую часть до первого '_'?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вы можете использовать namedtuple и split и создать новую структуру, подобную этой,

>>> class OldType(object):
...   def __init__(self, val1, val2):
...     self.val1 = val1
...     self.val2 = val2
...                                                                                                                                                             
>>>                                                                                                                                       
>>> from collections import namedtuple                                                                                                                                                 
>>>                                                                                                                                                  
>>> cus_struct = namedtuple('CustomStruct', ['letter', 'indices', 'value'])
>>> x = [OldType('a_1_1',4), OldType('a_1_2',2), OldType('x_1',True)]                                               
>>> [y.val1.partition('_') for y in x]
[('a', '_', '1_1'), ('a', '_', '1_2'), ('x', '_', '1')]                                                                                              
>>> 
>>>                                                                                                                                                  
>>> new_ds = []
>>> for y in x:
...   letter, _, indices = y.val1.partition('_')
...   indices = [int(k) for k in indices.split('_')]
...   new_ds.append(cus_struct(letter, indices, y.val2))
... 
>>> new_ds[0].letter
'a'
>>> new_ds[0].indices
[1, 1]
>>> new_ds[0].value
4
>>>
>>> for item in new_ds:
...   print(item.letter, item.indices, item.value)
... 
('a', [1, 1], 4)
('a', [1, 2], 2)
('x', [1], True)
0 голосов
/ 09 мая 2019

Это можно сделать, используя простое понимание списка:

new_dictlist = [
    { 'letter': i.name.split('_')[0], 'value': i.value }
    for i in old_type
]

Поскольку split возвращает список, используйте [0] для доступа к первой части.

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