पाइथन में एक शब्दकोश बनाम टपल का उपयोग करने के लिए


31

मन में विशिष्ट उदाहरण फ़ाइल नाम और उनके आकार की एक सूची है। मैं यह तय नहीं कर सकता कि सूची में प्रत्येक आइटम फॉर्म का होना चाहिए {"filename": "blabla", "size": 123}, या बस ("blabla", 123)। एक शब्दकोश मेरे लिए अधिक तर्कसंगत लगता है क्योंकि आकार तक पहुंचना, उदाहरण के लिए, file["size"]की तुलना में अधिक व्याख्यात्मक है file[1]... लेकिन मैं वास्तव में निश्चित रूप से नहीं जानता हूं। विचार?


एक परिशिष्ट के रूप में, टपल अनपैकिंग पर विचार करें , यदि आप टुपल्स की पठनीयता के बारे में चिंता करते हैं - fname, file_size = fileजहां डेटा आपके टुपल से ऊपर है, के साथ दूर करेगा file[1]और इसे बदल देगा file_size। बेशक यह एक अच्छे प्रलेखन पर निर्भर करता है।
nlsdfnbch

2
यह निर्भर करता है कि आप किस डेटा संरचना का निर्माण कर रहे हैं, और आप इसे कैसे एक्सेस करना चाहते हैं? (फ़ाइल नाम से, अनुक्रमणिका द्वारा? दोनों?) क्या यह सिर्फ एक विचलन चर / डेटा संरचना है, या क्या आप संभवतः अन्य वस्तुओं (/ विशेषताओं) के साथ-साथ आकार भी जोड़ रहे होंगे? क्या संरचना को एक आदेश याद रखने की आवश्यकता है; क्या आप आकार की सूची को सॉर्ट करना चाहते हैं, या इसे स्थिति के अनुसार एक्सेस करना चाहते हैं (उदाहरण के लिए "टॉप-एन सबसे बड़ी / सबसे छोटी फाइलें")? उन पर निर्भर करते हुए, 'सबसे अच्छा' जवाब तानाशाही, ऑर्डरडीडिक्ट, नेमटुपल, सादे पुरानी सूची, या अपने खुद के एक कस्टम वर्ग हो सकता है। आपसे और संदर्भ चाहिए।
smci

जवाबों:


78

मैं एक का उपयोग करेगा namedtuple:

from collections import namedtuple
Filesize = namedtuple('Filesize', 'filename size')
file = Filesize(filename="blabla", size=123)

अब आप उपयोग कर सकते हैं file.sizeऔर file.filenameअपने कार्यक्रम में, जो कि IMHO सबसे पठनीय रूप है। नोट namedtupleट्यूपल्स जैसी अपरिवर्तनीय वस्तुओं का निर्माण करता है, और वे शब्दकोशों की तुलना में अधिक हल्के होते हैं, जैसा कि यहां वर्णित है


1
धन्यवाद, अच्छा विचार, आज से पहले उनके बारे में कभी नहीं सुना (मैं पायथन में बहुत सुंदर हूं)। प्रश्न: क्या होता है अगर कोड में कहीं और कोई समान "वर्ग" को परिभाषित करता है, संभवतः थोड़ा अलग तरीके से। उदाहरण के लिए, कुछ अन्य स्रोत फ़ाइल में, सहकर्मी बॉब के पास थाFilesize = namedtuple('Filesize', 'filepath kilobytes')
user949300

आप बहुत अच्छे attrsमॉड्यूल का उपयोग भी कर सकते हैं (इसके माध्यम से pipखोज सकते हैं या बस इसके लिए खोज कर सकते हैं ), जो आपको टुपल नाम के समान समान वाक्यात्मक सुविधा देता है, लेकिन आपको परिवर्तनशीलता दे सकता है (लेकिन इसे अपरिवर्तनीय भी बनाया जा सकता है)। मुख्य कार्यात्मक अंतर यह है कि attrs-मॉडल वर्ग सादे ट्यूल के बराबर तुलना नहीं करते हैं, जिस तरह से namedtupleकरते हैं।
mtraceur

3
@DocBrown पायथन में घोषणाओं की कोई अवधारणा नहीं है। class, defऔर =सभी बस किसी भी पिछले उपयोग को अधिलेखित करते हैं। उत्तर.इट
चैलेंजर 5

@ चैलेंजर 5: आप सही हैं, मेरी गलती है, इसलिए सही उत्तर है: नवीनतम परिभाषा मायने रखती है, पायथन रनटाइम से कोई त्रुटि नहीं है, लेकिन फिर भी किसी अन्य चर के साथ समान व्यवहार।
डॉक्टर ब्राउन

8
ध्यान दें कि namedtupleअनिवार्य रूप से अपरिवर्तनीय विशेषताओं के साथ एक नए प्रकार के लिए एक शॉर्ट हैंड घोषणा है। इसका मतलब यह है कि उत्तर प्रभावी रूप से है, "न तो न tupleही ए dict, बल्कि ए object।" +1
jpmc26

18

{"फ़ाइल नाम": "ब्लाबला", "आकार": 123}, या बस ("ब्लाब्ला", 123)

यह आपके फॉर्मेट / स्कीमा इन-बैंड या आउट-ऑफ-बैंड को एनकोड करने का पुराना सवाल है।

डेटा में डेटा के प्रारूप को व्यक्त करने से प्राप्त होने वाली पठनीयता और पोर्टेबिलिटी प्राप्त करने के लिए आप कुछ मेमोरी का व्यापार करते हैं। यदि आप यह नहीं जानते हैं कि पहला फ़ील्ड फ़ाइल नाम है और दूसरा आकार है जिसे कहीं और रखा जाना है। यह मेमोरी को बचाता है लेकिन यह पठनीयता और पोर्टेबिलिटी को खर्च करता है। जो आपकी कंपनी को अधिक पैसा खर्च करने जा रहा है?

अपरिवर्तनीय मुद्दे के रूप में, याद रखें अपरिवर्तनीय का मतलब परिवर्तन के चेहरे पर बेकार नहीं है। इसका मतलब है कि हमें अधिक मेमोरी को हथियाने, कॉपी में बदलाव करने और नई कॉपी का उपयोग करने की आवश्यकता है। यह मुफ़्त नहीं है, लेकिन यह अक्सर एक सौदा ब्रेकर नहीं है। हम हर समय चीजों को बदलने के लिए अपरिवर्तनीय स्ट्रिंग्स का उपयोग करते हैं।

एक और विचार विलुप्ति है। जब आप डेटा को केवल स्थैतिक रूप से संग्रहीत करते हैं, बिना प्रारूप जानकारी को एन्कोडिंग के, तो आप केवल एकल वंशानुक्रम की निंदा करते हैं, जो वास्तव में कुछ भी नहीं है, लेकिन स्थापित क्षेत्रों के बाद अतिरिक्त क्षेत्रों को बदलने की प्रथा है। मैं निर्माण तिथि होने के लिए एक 3 क्षेत्र को परिभाषित कर सकता हूं और अभी भी आपके प्रारूप के अनुकूल हूं क्योंकि मैं पहले और दूसरे तरीके को परिभाषित करता हूं।

हालाँकि, मैं जो नहीं कर सकता, वह दो स्वतंत्र रूप से परिभाषित प्रारूप हैं, जिनमें कुछ अतिव्यापी क्षेत्र हैं, कुछ नहीं, उन्हें एक प्रारूप में संग्रहीत करते हैं, और यह उन चीजों के लिए उपयोगी है जो केवल एक या दूसरे स्वरूपों के बारे में जानते हैं।

ऐसा करने के लिए मुझे भीख से प्रारूप जानकारी को एनकोड करना होगा। मुझे यह कहने की आवश्यकता है "यह क्षेत्र फ़ाइल नाम है"। ऐसा करना जो कई उत्तराधिकार के लिए अनुमति देता है।

आप शायद केवल वस्तुओं के संदर्भ में व्यक्त की जाने वाली विरासत के लिए उपयोग किए जाते हैं, लेकिन डेटा प्रारूपों के लिए समान विचार काम करते हैं क्योंकि, ठीक है, ऑब्जेक्ट डेटा स्वरूपों में संग्रहीत होते हैं। यह वास्तव में एक ही समस्या है।

इसलिए जो भी आपको लगता है कि आप की जरूरत है सबसे अधिक उपयोग करें। मैं लचीलेपन के लिए पहुंचता हूं जब तक कि मैं एक अच्छे कारण की ओर इशारा नहीं कर सकता।


3
ईमानदार होने के लिए, मुझे संदेह है कि किसी व्यक्ति ने इन-बैंड या आउट-ऑफ-बैंड प्रारूप का उपयोग करने के बीच अनिश्चितता की ऐसी तंग प्रदर्शन आवश्यकताएं हैं जो उन्हें एक आउट-ऑफ-बैंड प्रारूप का उपयोग करने की आवश्यकता होगी
अलेक्जेंडर - पुनः स्थापित मोनिका

2
@Alexander बहुत सच है। मैं इसके बारे में लोगों को सिखाना पसंद करता हूं ताकि वे समझ सकें कि जब वे आउट-ऑफ-बैंड समाधानों का सामना कर रहे हैं तो वे क्या देख रहे हैं। द्विआधारी प्रारूप अक्सर आक्षेप कारणों के लिए ऐसा करते हैं। हर कोई पोर्टेबल नहीं होना चाहता है। प्रदर्शन के कारणों के लिए, अगर यह वास्तव में मामलों से बाहर बैंड का सहारा लेने से पहले संपीड़न पर विचार करता है।
कैंडिड_ऑरेंज

याद रखें कि ओपी पायथन का उपयोग कर रहा है, इसलिए वे प्रदर्शन के बारे में बहुत चिंतित नहीं हैं। अधिकांश उच्च-स्तरीय कोड पहले पठनीयता को ध्यान में रखकर लिखे जाने चाहिए; सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है।
Dagrooms

@ डैगर पायथन पर नफरत नहीं करते। यह कई मामलों में अच्छा प्रदर्शन करता है। लेकिन अन्यथा मैं आपकी हर बात से सहमत हूं। मेरा कहना यह था कि "यही कारण है कि लोग ऐसा करते हैं। यहाँ इस बात की संभावना है कि आप परवाह न करें"।
कैंडिड_ओरेंज

@CandiedOrange मैं भाषा से नफरत नहीं कर रहा हूँ, मैं इसे अपने दैनिक कार्य में उपयोग करता हूँ। मैं लोगों को इसके इस्तेमाल करने के तरीके को नापसंद करता हूं।
डैगरूम

7

मैं एक वर्ग का उपयोग दो गुणों के साथ करूंगा। या file.sizeतो की तुलना में अच्छा है file[1]या file["size"]

सरल जटिल से बेहतर है।


अगर कोई सोच रहा है: JSONs बनाने के लिए, दोनों समान रूप से काम करते हैं: file = Filesize(filename='stuff.txt', size=222)और filetup = ("stuff.txt", 222)दोनों एक ही JSON उत्पन्न करते हैं: json.dumps(file)और json.dumps(filetup)परिणाम:'["stuff.txt", 222]'
Juha Untinen

5

क्या फ़ाइल नाम अद्वितीय हैं? यदि हां, तो आप पूरी तरह से सूची को स्क्रैप कर सकते हैं और सभी फाइलों के लिए केवल एक शुद्ध शब्दकोश का उपयोग कर सकते हैं। उदाहरण के लिए (एक काल्पनिक वेबसाइट)

{ 
  "/index.html" : 5467,
  "/about.html" : 3425,
  "/css/main.css" : 9876
}

आदि...

अब, आपको "नाम" और "आकार" नहीं मिलता है, आप बस कुंजी और मूल्य का उपयोग करते हैं, लेकिन अक्सर यह अधिक स्वाभाविक है। YMMV।

यदि आप वास्तव में स्पष्टता के लिए "आकार" चाहते हैं, या आपको फ़ाइल के लिए एक से अधिक मान चाहिए, तो:

{ 
   "/index.html" : { "size": 5467, "mime_type" : "foo" },
   "/about.html" : { "size": 3425, "mime_type" : "foo" }
   "/css/main.css" : { "size": 9876, "mime_type" : "bar" }
}

0

अजगर में, शब्द परिवर्तनशील वस्तु है। दूसरी तरफ, टूपल अपरिवर्तनीय वस्तु है।

यदि आपको शब्दकोश कुंजी, मूल्य जोड़ी को अक्सर या हर बार बदलना होगा। मैं शब्दकोश का उपयोग करने का सुझाव देता हूं।

यदि आपके पास स्थिर / स्थिर डेटा है, तो मैं सुझाव देता हूं कि टपल का उपयोग करें।

# dictionary define.
a = {}
a['test'] = 'first value'

# tuple define.
b = ()
b = b+(1,)

# here, we can change dictionary value for key 'test'
a['test'] = 'second'

लेकिन, असाइनमेंट ऑपरेटर का उपयोग करके टपल डेटा को बदलने में सक्षम नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.