2012-07-09 8 views
18

क्या पाइथन सूची में विभिन्न प्रकारों को मिलाकर अप्रत्याशित समस्याएं हैं? उदाहरण के लिए:क्या मैं पाइथन सूची में सुरक्षित मिश्रण प्रकार हूं?

import random 
data = [["name1", "long name1", 1, 2, 3], 
     ["name2", "long name2", 5, 6, 7]] 
name, long_name, int1, int2, int3 = random.choice(data) 

मैं इस कोड का उपयोग कर रहा बेतरतीब ढंग से एक समारोह के भीतर कई संबंधित मानकों को स्थापित करने के लिए है, लेकिन फिर भी अजगर इसका समर्थन करता है, मैं किसी सूची में इस तरह प्रकार के मिश्रण से सावधान कर रहा हूँ। चूंकि मिश्रित डेटा प्रकारों की सूची किसी भी प्रसंस्करण के लिए उपयोग नहीं की जाएगी, इसके अलावा वेरिएबल असाइनमेंट और स्वयं (वेरिएबल्स जो इसे आवंटित करती हैं, लेकिन सूची नहीं), मुझे लगता है कि यह ठीक है, लेकिन मैं यह सुनिश्चित करना चाहता हूं गुप्त रूप से समस्याग्रस्त कोड नहीं है।

+1

तकनीकी रूप से सरणी तत्व _are_ सभी एक ही प्रकार - संदर्भ (वस्तुओं के लिए) –

+0

@gnibbler अच्छा बिंदु। –

उत्तर

24

नहीं, कोई समस्या नहीं है, आप किसी भी प्रकार को list के अंदर "पुराने दिनों" के विपरीत स्टोर कर सकते हैं, जब अन्य भाषाओं में एरे होते थे जो केवल उनमें से एक प्रकार का डेटा संग्रहीत करना चाहते थे।

चूंकि सूचियां अन्य सूची संग्रह भी कर सकती हैं, और अन्य यौगिक डेटा संरचनाओं के साथ, अन्य ऑब्जेक्ट संदर्भों के साथ, सूची के माध्यम से प्रसंस्करण या पुनरावृत्ति संभवतः कई परतों के कारण थोड़ा अधिक जटिल हो सकती है, बस एक सरणी में जाकर सरल एकल स्तर पुनरावृत्ति। यह shallow and deep copying से भी संबंधित है।

यदि सूचियों को संसाधित करने वाले कोड इस बारे में जानते हैं, तो मैं सूची में अलग-अलग चीज़ों को स्टोर करने की इस क्षमता के कारण किसी भी समस्या का विचार नहीं कर सकता।

+0

धन्यवाद। मुझे पता है कि मैं * किसी भी डेटा प्रकार को स्टोर कर सकता हूं, लेकिन मैं यह सुनिश्चित करना चाहता था कि कोई समस्या स्वयं प्रकट न हो कि मैं बस जल्दी से बच सकता हूं। –

+3

@ रिकार्डो एल्टामिरानो इस से उत्पन्न होने वाली एकमात्र समस्या यह है कि कोड प्रोसेसिंग सूचियों को इसके लिए खाते की आवश्यकता होती है क्योंकि सूचियों में सूचियां, या अन्य डेटा संरचनाएं हो सकती हैं। अन्यथा, मैं इसके साथ किसी भी समस्या के बारे में नहीं सोच सकता। – Levon

+0

खैर, 'डेटा' सूची संसाधित कोड सब कुछ है। यह 'random.choice' से अधिक कुछ नहीं है, और जहां तक ​​मुझे पता है इसे ठीक से संभालना चाहिए। –

6

सूची में एकाधिक डेटा प्रकार होने में कोई अंतर्निहित समस्या नहीं है। समस्याएं, निश्चित रूप से उत्पन्न हो सकती हैं यदि आप उस सूची का उपयोग किसी ऐसी चीज़ के लिए करने का प्रयास करते हैं जो सभी समान प्रकार के होने की अपेक्षा करता है। आपके उदाहरण में, यदि आप सब कुछ कर रहे हैं, तो समस्या बनने का कोई तरीका नहीं है। आप एक सूची के बजाय एक tuple का उपयोग कर, हालांकि, विचार कर सकते हैं। सम्मेलन के अनुसार, अनुक्रम की संरचना तय होने पर tuples का उपयोग किया जाता है; सूचियों का उपयोग तब किया जाता है जब आप अनुक्रम से जोड़ या निकाल सकते हैं।

+0

यही मैंने सोचा था, लेकिन चूंकि मैं केवल सूची में डेटा को अपने संबंधित चर में अलग से उपयोग करूँगा, मुझे नहीं लगता था कि इससे नुकसान होगा। –

9

भाषा आपके साथ सूची में मिश्रित प्रकार ठीक है, लेकिन आपको पता होना चाहिए कि पाइथन संस्कृति उस पर फहरा सकती है। ट्यूपल्स आमतौर पर तब उपयोग किए जाते हैं जब आपके पास मिश्रित प्रकार का ज्ञात संग्रह होता है, और विभिन्न अनुक्रमणिका में अलग-अलग अर्थशास्त्र होते हैं। आमतौर पर सूचियों का उपयोग किया जाता है जहां आपके पास अलग-अलग लंबाई का एक समान अनुक्रम होता है।

data = [ 
    ("name1", "long name1", 1, 2, 3), 
    ("name2", "long name2", 5, 6, 7), 
    ... 
] 

इसे और अधिक संक्षेप में कहें:

तो आपके डेटा को अधिक पारंपरिक रूप में प्रतिनिधित्व किया जाएगा tuples सी structs, सी सरणियों की तरह सूचियों की तरह किया जाता है।

+0

और यदि आपका ट्यूपल लंबा है या आपके कोड में कई जगहों का उपयोग किया जाता है, तो आप इसके बजाय कक्षा को परिभाषित करना चाहेंगे, ताकि आप उस स्थिति को प्रत्येक स्थिति में नाम दे सकें। –

संबंधित मुद्दे