Python: 将元组列表转换为对象列表?
Python: Convert list of tuples into a list of objects?
如果我有如下元组列表:
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 )
我想我设法弄清楚了如何使用循环和元组拆包一次转换一个元素(对我来说是新的)。所以基本上,迭代元组列表并在我将它们附加到第二个列表时一次构造一个对象。这是处理此问题的最佳方法吗?
原因:我正在尝试允许外部代码将类似枚举的属性作为元组列表发送,然后使用它来生成 class 实例列表来表示类似枚举的数据。我需要 classes 的唯一原因是允许外部代码使用命名成员引用数据,例如 enum_ref.Ident
(而不是 enum_ref[2]
)。但也许有更好的方法来处理这种情况?
非常感谢任何建议。我对 Python 没有经验,所以你可以放心地假设我不了解所有基础知识。
编辑:这里是 OBJECT
的定义。这是一个可以更改的自定义 class,但是为了使这项工作我需要:
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
我认为您已经自己回答了这个问题,您可以使用列表理解而不是使用循环:
Objects = [OBJECT(*x) for x in Data]
虽然我看到你的 Data
中的元组缺少一个用于 OBJECT
构造的参数(对应于 desc
的参数)。
您可以使用内置 map
函数的不同方法,如下所示:
list_of_objects = list(map(lambda tpl: OBJECT(*tpl), Data))
注意,map
只产生一个迭代器 list
调用不能省略。
我认为 namedtuple 是一个很好的最小化 Python class,可以方便地按名称访问属性。这看起来像
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 替换了字符串。
如果我有如下元组列表:
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 )
我想我设法弄清楚了如何使用循环和元组拆包一次转换一个元素(对我来说是新的)。所以基本上,迭代元组列表并在我将它们附加到第二个列表时一次构造一个对象。这是处理此问题的最佳方法吗?
原因:我正在尝试允许外部代码将类似枚举的属性作为元组列表发送,然后使用它来生成 class 实例列表来表示类似枚举的数据。我需要 classes 的唯一原因是允许外部代码使用命名成员引用数据,例如 enum_ref.Ident
(而不是 enum_ref[2]
)。但也许有更好的方法来处理这种情况?
非常感谢任何建议。我对 Python 没有经验,所以你可以放心地假设我不了解所有基础知识。
编辑:这里是 OBJECT
的定义。这是一个可以更改的自定义 class,但是为了使这项工作我需要:
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
我认为您已经自己回答了这个问题,您可以使用列表理解而不是使用循环:
Objects = [OBJECT(*x) for x in Data]
虽然我看到你的 Data
中的元组缺少一个用于 OBJECT
构造的参数(对应于 desc
的参数)。
您可以使用内置 map
函数的不同方法,如下所示:
list_of_objects = list(map(lambda tpl: OBJECT(*tpl), Data))
注意,map
只产生一个迭代器 list
调用不能省略。
我认为 namedtuple 是一个很好的最小化 Python class,可以方便地按名称访问属性。这看起来像
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 替换了字符串。