श्रेणी की वस्तुओं के साथ समझ की सूची
मेरे पास Subfile.py में एक वर्ग है जिसका नाम है StrucData
class StrucData:
def __init__(self, name):
self.name=name
def loadData(self, size=1, cost=1):
self.size=size
self.cost=cost
मुख्य फाइल में I:
- सबफ़ाइल को कॉल करें,
- डेटा नामों की एक सूची बनाएँ
- वस्तुओं को त्वरित करने के लिए सूची के माध्यम से लूप; तथा
- प्रत्येक वस्तु के लिए 'लोडडेटा' पद्धति का उपयोग करके डेटा लोड करें (मैं इस उदाहरण को आसान बनाने के लिए समान आकार और लागत का उपयोग कर रहा हूं।)
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
की अंतिम पंक्ति के लिए स्वतंत्र हैं , तो इसे इस तरह सरल बनाया जा सकता है:StrucData.loadData()
subfile.py
# in the main file
listObjects = [StrucData(idx).loadData(size=3, cost=4) for idx in listIndex]
अन्यथा, आपको इसे अलग से करना loadData()
होगा क्योंकि सूची समझ अभिव्यक्ति के लिए कुछ भी वापस नहीं होगा।
listObjects = [StrucData(idx) for idx in listIndex]
for i in range(3):
listObjects[i].loadData(size=3, cost=4)
बिल हुआंग की प्रतिक्रिया को लागू करते हुए, यदि आप वस्तु को बदलने के लिए स्वतंत्र नहीं हैं और आप दो बार पुनरावृति नहीं करना चाहते हैं, तो आप एक सहायक सूची जोड़ सकते हैं:
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)])
विच लौटेगा:
[StructData(name=0, size=3, cost=4),
StructData(name=1, size=3, cost=4),
StructData(name=2, size=3, cost=4)]
अंत में, यह देखते हुए कि आपके पास "data1", "data2" जैसे नाम हैं, आप शायद यह चाहते हैं कि क्लासनेम के रूप में, आप नामांकित के साथ ऐसा कर सकते हैं जब तक कि नाम मान्य वर्ग पहचानकर्ता हैं:
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)]