श्रेणी की वस्तुओं के साथ समझ की सूची

Nov 26 2020

मेरे पास 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:

  1. सबफ़ाइल को कॉल करें,
  2. डेटा नामों की एक सूची बनाएँ
  3. वस्तुओं को त्वरित करने के लिए सूची के माध्यम से लूप; तथा
  4. प्रत्येक वस्तु के लिए 'लोडडेटा' पद्धति का उपयोग करके डेटा लोड करें (मैं इस उदाहरण को आसान बनाने के लिए समान आकार और लागत का उपयोग कर रहा हूं।)
    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)]]

जो निश्चित रूप से काम नहीं करता है, लेकिन मुझे नहीं पता कि यह कैसे ठीक से करना है।

क्या मैं कृपया एक सूची समझ का उपयोग करके वांछित आउटपुट प्राप्त करने के लिए अपने कोड पर सलाह दे सकता हूँ ??

जवाब

1 BillHuang Nov 26 2020 at 19:00

यदि आप भीतर 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)
2 DavidFrancosCuartero Nov 26 2020 at 19:26

बिल हुआंग की प्रतिक्रिया को लागू करते हुए, यदि आप वस्तु को बदलने के लिए स्वतंत्र नहीं हैं और आप दो बार पुनरावृति नहीं करना चाहते हैं, तो आप एक सहायक सूची जोड़ सकते हैं:

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