2014-10-13 2 views
-2

У меня есть список списков списков 2-элементов, например:Python создать список объектов из списка 2-х элементов списков

[[[a, b], [c, d], [e, f]], [[g, h], [i, j], [k, l]]] 

и я хочу, чтобы создать список объектов с атрибутами из двух- списки элементов, как это:

[(obj.a = b, obj.c=d, obj.e=f), (obj.g=h, obj.i=j, obj.k=l)] 

Я перепробовал много способов, но, кажется, я действительно не знаю, как создать объект, как a = object() и установка AttrS через object.__setattr__ не работает для меня.

+3

Что * "не работает для меня" * значит, точно? Где ваш код и что именно с ним не так? Действительно ли ваш список (в конце концов) содержит строки или некоторые другие объекты? – jonrsharpe

+0

Да, большая причина, по которой этот вопрос не отвечает в его нынешнем виде, заключается в том, что вы не следовали руководству по отправке кода, который вы на самом деле пытаетесь запустить. – ErlVolton

+0

Вы правы, оба из вас, но скажем, через 3 часа переписывания со многих точек зрения, я не уверен, какую попытку я должен сделать точно ... – Viker

ответ

2

Вы не можете установить произвольные атрибуты на object случаях:

>>> a = object() 
>>> a.b = 'c' 

Traceback (most recent call last): 
    File "<pyshell#56>", line 1, in <module> 
    a.b = 'c' 
AttributeError: 'object' object has no attribute 'b' 

Howver, вы можете создать Generic класс, который позволит вам:

class Generic(object): 
    pass 

Затем предполагается, что ваш список содержит пары нитей:

l = [[['a', 'b'], ['c', 'd'], ['e', 'f']], 
    [['g', 'h'], ['i', 'j'], ['k', 'l']]] 

вы можете перемещаться по ней следующим образом:

out = [] 
for ll in l: 
    obj = Generic() 
    for attr, val in ll: 
     setattr(obj, attr, val) 
    out.append(obj) 

В качестве альтернативы, вы можете использовать три-аргумента формы type создавать произвольные классы, а затем создать экземпляры тех:

out = [type("Generic", (object,), dict(ll))() for ll in l] 

Обратите внимание:

>>> dict(l[0]) 
{'a': 'b', 'c': 'd', 'e': 'f'} 

Наконец, если у вас есть реальный (не общий) объект, который требуется, например, a, c, e в качестве аргументов __init__:

class Actual(object): 
    def __init__(self, a, c, e): 
     self.a = a 
     self.c = c 
     self.e = e 

Вы можете использовать словарь распаковку для создания экземпляра из подсписка например l[0]:

obj = Actual(**dict(l[0])) 
+0

Это было именно то, что я имел в виду, через несколько часов я сделал «жестокую» настройку (созданный объект, по некоторым внутренним циклам берут данные из «внутри» внутреннего списка и назначил его вручную), но эта итерация о парах именно то, что мне нужно. Спасибо – Viker

0

Если вы сомневаетесь, используйте Dict:

>>> A=[[["a", "b"], ["c", "d"], ["e", "f"]], [["g", "h"], ["i", "j"], ["k", "l"]]] 
>>> [x for x in A] 
[[['a', 'b'], ['c', 'd'], ['e', 'f']], [['g', 'h'], ['i', 'j'], ['k', 'l']]] 
>>> B = [dict(x) for x in A] 
>>> repr(B) 
[{'a': 'b', 'c': 'd', 'e': 'f'}, {'i': 'j', 'k': 'l', 'g': 'h'}] 
+0

Я не совсем уверен в механизме, который вы используете здесь, можете ли вы прояснить немного?Я пытался сделать dict из внутреннего списка, но всегда получаю ошибку, например: need # 0 length of 2, но 5 предоставляется, что я не уверен, что это означает, когда у меня всегда есть пары внутри внутреннего списка (проверено x раз по pprint на каждом шагу) – Viker

Смежные вопросы