【问题标题】:Python create list of objects from list of 2 elements listsPython从2个元素列表中创建对象列表
【发布时间】:2014-10-13 13:45:09
【问题描述】:

我有一个 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 对我不起作用。

【问题讨论】:

  • “不适合我” 到底是什么意思?你的代码在哪里,它到底有什么问题?您的列表实际上(最终)是否包含字符串或其他一些对象?
  • 是的,这个问题无法以当前形式回答的一个重要原因是您没有遵循发布您实际尝试运行的代码的指南
  • 你是对的,你们俩,但是假设从多个角度重写了 3 个小时后,我不确定我应该准确地通过哪个尝试...

标签: python list object setattr


【解决方案1】:

您不能在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'}

最后,如果您有一个实际(非通用)对象,例如ace 作为 __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]))

【讨论】:

  • 这正是我的想法,几个小时后我做了“残酷”的分配(创建对象,通过一些内部循环从内部列表的“内部”取出数据并手动分配),但是关于对的迭代正是我所需要的。谢谢
【解决方案2】:

如有疑问,请使用字典:

>>> 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'}]

【讨论】:

  • 我不太确定你在这里使用的机制,你能澄清一下吗?我试图从内部列表中制作 dict,但我总是收到错误,例如:需要 #0 长度为 2 但提供了 5,我不确定当我总是在内部列表中有对时这意味着什么(通过 pprint 检查 x 次每一步)
猜你喜欢
  • 2019-10-26
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多