列出包含 class 个对象的推导式

List comprehensions with class objects

我在 subfile.py

中有一个名为 StrucData 的 class
class StrucData:  
def __init__(self, name):
    self.name=name

def loadData(self, size=1, cost=1):
    self.size=size  
    self.cost=cost

在我的主文件中:

  1. 调用子文件,
  2. 创建数据名称列表
  3. 遍历列表以实例化对象;和
  4. 使用每个对象的 'loadData' 方法加载数据(我使用相同的 'size' 和 'cost' 来简化此示例。)
    from subfile import StrucData 

    listIndex=['data1','data2','data3']

    # Create a list of objects
    listObjects=[]

    # Iterate through the list of objects
    for i in range(3):
        data=StrucData(listIndex[i])
        data.loadData(size=3, cost=4)
        listObjects.append(data)

我想做的是使用列表理解做同样的事情,以获得

listObjects=[object1, object2, object3]

我试过类似

的东西
listObjects=[[StrucData(listIndex[i]) for k in range(3)] listObjects[i].loadData(size=3, cost=4) for i in range(3)]]

这当然行不通,但我不知道如何正确地做到这一点。

能否请我对我的代码提出建议,以使用列表理解获得所需的输出?

如果您可以随意将 return self 附加到 subfile.pyStrucData.loadData() 的最后一行,则可以简化为:

# in the main file
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]

否则,您必须单独执行此操作,因为 loadData() 不会 return 任何列表理解表达式。

listObjects = [StrucData(idx) for idx in listIndex]
for i in range(3):
    listObjects[i].loadData(size=3, cost=4)

补充Bill Huang的回复,如果你不能随意更改对象并且不想迭代两次,你可以添加一个辅助函数:

def load_data(idx, size, cost):
    result = StructData(idx)
    result.loadData(size, cost)
    return result

[load_data(x, size=3, cost=4) for x in range(3)]

作为旁注,如果您真的不需要实例将名称和加载数据分开,您可以只使用命名元组:

from collections import namedtuple

StructData = namedtuple('StructData', ['name', 'size', 'cost'])
print([StructData(name=x, size=3, cost=4) for x in range(3)])

会 return:

[StructData(name=0, size=3, cost=4), 
 StructData(name=1, size=3, cost=4), 
 StructData(name=2, size=3, cost=4)]

最后,看到您有诸如“data1”、“data2”之类的名称,您可能希望将其作为 classnames,只要名称有效,您就可以使用 namedtuple class 标识符:

from collections import namedtuple

list_index = ['data1', 'data2', 'data3']
print([namedtuple(name, ['size', 'cost'])(3, 4) for name in list_index])

结果:

[data1(size=3, cost=4), data2(size=3, cost=4), data3(size=3, cost=4)]