使用python

时间:2019-05-09 13:41:18

标签: python list dictionary

我是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))]

会创建非常深的列表(“ a”的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('_')这样的python我只能返回字符串部分直到第一个'_'吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用namedtuplesplit并创建一个新的结构,

>>> 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)

答案 1 :(得分:0)

这可以通过简单的列表理解来实现:

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

由于split返回列表,所以请使用[0]访问第一部分。