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

Posted

技术标签:

【中文标题】Python:将元组列表转换为对象列表?【英文标题】:Python: Convert list of tuples into a list of objects? 【发布时间】:2019-10-12 13:59:34 【问题描述】:

如果我有如下元组列表:

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" ),
]

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

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" ),
]

我希望有类似的东西 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

【问题讨论】:

OBJECT 是你定义的类吗? 是的,我会用类定义编辑 【参考方案1】:

我想你已经自己回答了这个问题,而不是使用循环,你可以使用列表理解:

Objects = [OBJECT(*x) for x in Data]

虽然我看到您的 Data 中的元组缺少 OBJECT 构造的一个参数(对应于 desc 的参数)。

【讨论】:

我没有考虑过使用列表理解。所以更好的解决方案。谢谢! 是的,很抱歉缺少desc。我的描述字符串很大,所以我删除了那个条目以避免混乱,但忘记对我的班级做同样的事情。【参考方案2】:

我认为 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]

之后:

>>> objects[0].IDENT
GA

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

【讨论】:

这对我来说是新的。我喜欢您可以让外部代码定义成员名称以匹配其特定数据类型的事实。我很难在这个答案和接受的答案之间做出选择。我只选择了另一个,因为它是第一个。我不明白为什么我们不能有多个接受的答案。【参考方案3】:

您可以对内置 map 函数使用不同的方法,如下所示:

list_of_objects = list(map(lambda tpl: OBJECT(*tpl), Data))

注意,map 只生成一个迭代器,list 调用不能省略。

【讨论】:

真的很整洁 - 我不知道 map() 函数。所以它本质上为每个元素调用一个函数?这将非常有用,尤其是lambda。如果我现在不使用它,我以后肯定会使用它。如果我可以选择多个答案,这是我会接受的另一个答案。非常感谢这些信息。

以上是关于Python:将元组列表转换为对象列表?的主要内容,如果未能解决你的问题,请参考以下文章

将元组列表转换为python中的列表

python 将元组列表,字典转换为数据帧

将元组列表转换为 Pandas 系列

将元组中的列表转换为numpy数组?

将元组列表列表转换为 dict 未按预期工作

将元组列表转换为字典