Python:将元组列表转换为对象列表?

Rob*_*ert 3 python tuples list unpack pack

如果我有一个如下所示的元组列表:

Data = [
        #   OP,  FLAG,   IDENT,  NAME
        ( Op.GA, Flag.GA, "GA", "Asset" ),
        ( Op.LP, Flag.LP, "LP", "Low" ),
        ( Op.HP, Flag.HP, "HP", "High" ),
        ( Op.CU, Flag.CU, "CU", "Custom" ),
]
Run Code Online (Sandbox Code Playgroud)

有没有一种聪明的方法可以将其转换为对象列表,这样就像我执行了以下操作:

Objects = [
        #       OP,    FLAG,    IDENT,  NAME
        OBJECT( Op.GA, Flag.GA, "GA", "Asset" ),
        OBJECT( Op.LP, Flag.LP, "LP", "Low" ),
        OBJECT( Op.HP, Flag.HP, "HP", "High" ),
        OBJECT( Op.CU, Flag.CU, "CU", "Custom" ),
]
Run Code Online (Sandbox Code Playgroud)

我希望有类似的事情 Objects = create( OBJECT, Data )

我想我设法弄清楚如何使用循环和元组解包一次转换一个元素(对我来说是新的)。因此,本质上,迭代元组列表并在将它们附加到第二个列表时一次构造一个对象。这是处理这个问题的最好方法吗?

原因:我试图允许外部代码将类似枚举的属性作为元组列表发送,然后使用它来生成类实例列表来表示类似枚举的数据。我需要类的唯一原因是允许外部代码使用命名成员引用数据,例如enum_ref.Ident(而不是enum_ref[2])。但也许有更好的方法来处理这种情况?

非常感谢任何建议。我对 Python 缺乏经验,所以你可以放心地假设我不了解所有基础知识。

编辑:这是 的定义OBJECT。这是一个自定义类,可以根据我的需要进行更改,以使其工作:

class OBJECT:

    # construct / attributes
    def __init__(self,index,value,ident,name):

        self.Index = index  # enum index or type-index
        self.Value = value  # actual value of the entry (any type)
        self.Ident = ident  # identifier string (for Blender and searching)
        self.Name = name    # display name
Run Code Online (Sandbox Code Playgroud)

gst*_*gst 9

我认为您已经回答了自己这个问题,您可以使用列表理解来代替使用循环:

Objects = [OBJECT(*x) for x in Data]
Run Code Online (Sandbox Code Playgroud)

尽管我看到您的元组Data缺少一个OBJECT构造参数(与 对应的参数desc)。


Pom*_*mmy 5

我认为namedtuple是一个很好的最小Python类,可以通过名称方便地访问属性。这是它的样子

from collections import namedtuple
Data = [
        #   OP,  FLAG,   IDENT,  NAME
        ( "Op.GA", "Flag.GA", "GA", "Asset" ),
        ( "Op.LP", "Flag.LP", "LP", "Low" ),
        ( "Op.HP", "Flag.HP", "HP", "High" ),
        ( "Op.CU", "Flag.CU", "CU", "Custom" ),
]

Object = namedtuple("Object", "OP FLAG IDENT NAME")
objects = [Object(*t) for t in Data]
Run Code Online (Sandbox Code Playgroud)

在那之后:

>>> objects[0].IDENT
GA
Run Code Online (Sandbox Code Playgroud)

为了立即运行示例,PS 将您的Op.GA替换为单纯的字符串。