我有一个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()
这样的对象,并通过object.__setattr__
设置attrs对我没用。
答案 0 :(得分: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'
但是,您可以创建一个允许您执行的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]))
答案 1 :(得分:0)
如有疑问,请使用词典:
>>> 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'}]