列出包含 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
在我的主文件中:
- 调用子文件,
- 创建数据名称列表
- 遍历列表以实例化对象;和
- 使用每个对象的 '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.py
中 StrucData.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)]
我在 subfile.py
中有一个名为 StrucData 的 classclass StrucData:
def __init__(self, name):
self.name=name
def loadData(self, size=1, cost=1):
self.size=size
self.cost=cost
在我的主文件中:
- 调用子文件,
- 创建数据名称列表
- 遍历列表以实例化对象;和
- 使用每个对象的 '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.py
中 StrucData.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)]