2010-05-17 13 views
138

मैं पाइथन सीखने के लिए कुछ प्रयास कर रहा हूं, और मैं सामान्य कोडिंग मानकों पर ध्यान दे रहा हूं। यह एक निर्विवाद रूप से नाइट-पिक्य प्रश्न की तरह प्रतीत हो सकता है, लेकिन मैं सीखने के रूप में सर्वोत्तम प्रथाओं पर ध्यान केंद्रित करने की कोशिश कर रहा हूं, इसलिए मुझे किसी भी 'बुरी' आदतों को दूर करने की आवश्यकता नहीं है।एक dict प्रारंभ करने के लिए पसंदीदा वाक्यविन्यास क्या है: घुंघराले ब्रेस अक्षर {} या dict() फ़ंक्शन?

a = { 
    'a': 'value', 
    'another': 'value', 
} 

b = dict( 
    a='value', 
    another='value', 
) 

कौन सा माना जाता है "और अधिक pythonic" होने के लिए:

मैं एक dict आरंभ के लिए दो सामान्य तरीके देखते हैं? आप किसका उपयोग करते हैं? क्यूं कर?

+4

आप किस ट्यूटोरियल का उपयोग कर रहे हैं? आपने उदाहरण कहाँ देखे जो भ्रम पैदा करते हैं? –

+2

खैर, मैं पाइथन ट्यूटोरियल का उपयोग कर रहा हूं, पाइथन में गोता लगाता हूं और फिर विभिन्न प्रकार के ब्लॉग, एसओ पोस्ट और अन्य गुगल संसाधनों का उपयोग करता हूं। आधिकारिक दस्तावेज़ '{} 'समान रूप से समान रूप से उपयोग करते हैं, लेकिन मुझे कहीं और स्पष्ट' dict()' दृष्टिकोण कहीं और दिखाई देता है। मैं एक स्पष्ट वाक्यविन्यास का लाभ देख सकता था, लेकिन आधिकारिक दस्तावेज़ों में दृष्टिकोण की अनुपस्थिति ने मुझे संदिग्ध बना दिया।इसे पोस्ट करने के बाद मैंने 'dict' के लिए लाइब्रेरी दस्तावेज़ों को देखा और सावधानी बरतनी कि कुंजियों को प्रारंभ करने के लिए एक स्पष्ट' dict' का उपयोग होने पर कुंजी को वैध पहचानकर्ता होना चाहिए। – daotoad

+2

"dict()" "{}" से अधिक स्पष्ट कैसे है? मैं आपके भ्रम को समझ नहीं रहा हूँ। दोनों मुझे स्पष्ट लगते हैं। क्या आप एक उद्धरण या संदर्भ प्रदान कर सकते हैं जो आपको "dict" कहता है "स्पष्ट" और "{}" स्पष्ट नहीं है? आपको लगता है कि यह भेद कहां से उभरा? –

उत्तर

162

घुंघराले ब्रेसिज़। कीवर्ड तर्कों को dict() में पास करना, हालांकि यह कई परिदृश्यों में खूबसूरती से काम करता है, यदि कुंजी मान्य पायथन पहचानकर्ता हैं तो केवल नक्शा प्रारंभ कर सकते हैं।

दूसरे शब्दों में यह नहीं कर सकते:

a = {'import': 'trade', 1: 7.8} 
65

पहला, घुंघराले ब्रेसिज़। अन्यथा, आप उन कुंजियों के साथ स्थिरता समस्याओं में भाग लेते हैं जिनमें = जैसे विषम वर्ण हैं।

# Works fine. 
a = { 
    'a': 'value', 
    'b=c': 'value', 
} 

# Eeep! Breaks if trying to be consistent. 
b = dict( 
    a='value', 
    b=c='value', 
) 
+3

यही कारण है कि कोई प्रारंभिकरण के लिए dict() विधि को प्राथमिकता दे सकता है, यह शब्दकोश कुंजी को मान्य पहचानकर्ता होने के लिए मजबूर करता है, इसलिए वे अनुकूल हैं, उदाहरण के लिए, ** kwargs, और कुंजी वैध विशेषता नाम हैं। – RufusVS

46

पहले संस्करण बेहतर है:

  • यह कुंजी के सभी प्रकार के लिए काम करता है, तो आप, उदाहरण के लिए, {1: 'one', 2: 'two'} कह सकते हैं। दूसरा संस्करण केवल कुछ (कुछ) स्ट्रिंग कुंजी के लिए काम करता है। चाबियों के प्रकार के आधार पर विभिन्न प्रकार के वाक्यविन्यास का उपयोग करना एक अनावश्यक असंगतता होगी।
  • यह तेजी से होता है:

    $ python -m timeit "dict(a='value', another='value')" 
    1000000 loops, best of 3: 0.79 usec per loop 
    $ python -m timeit "{'a': 'value','another': 'value'}" 
    1000000 loops, best of 3: 0.305 usec per loop 
    
  • शब्दकोश शाब्दिक के लिए विशेष सिंटेक्स इस्तेमाल किया जा करने का इरादा नहीं था, तो यह शायद मौजूद नहीं होता।
3

मुझे लगता है कि पहला विकल्प बेहतर है क्योंकि आप एक [ 'एक'] या एक [ 'एक और'] के रूप मूल्यों तक पहुँचने के लिए जा रहे हैं। आपके शब्दकोश में चाबियां तार हैं, और नाटक करने का कोई कारण नहीं है कि वे नहीं हैं। मेरे लिए कीवर्ड वाक्यविन्यास पहले चालाक लग रहा है, लेकिन एक दूसरे रूप में अस्पष्ट। यह केवल मुझे समझ में आता है अगर आप __dict__ के साथ काम कर रहे हैं, और कीवर्ड बाद में गुण बनने जा रहे हैं, ऐसा कुछ।

2

एफवाईआई, यदि आपको अपने शब्दकोश में विशेषताओं को जोड़ने की ज़रूरत है (जो शब्दकोष से जुड़ी हैं, लेकिन चाबियों में से एक नहीं हैं), तो आपको दूसरे फॉर्म की आवश्यकता होगी।

class mydict(dict): pass 
    a = mydict()   
    a["b=c"] = 'value' 
    a.test = False 
0

कभी कभी dict() एक अच्छा विकल्प है: उस मामले में, आप कुंजी स्वैच्छिक वर्णों, एक समय में एक है, इसलिए की तरह होने के साथ अपने शब्दकोश को प्रारंभ कर सकते हैं

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)])) 

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'], 

[random.randint (0,100) एक्स में रेंज (0,7)]))

+2

एक गणितीय फ़ंक्शन है जो इसे बेहतर कर सकता है। उस मामले के लिए, एक एनम प्रकार है जो आप यहां बेहतर कर रहे हैं जो कर सकते हैं। साथ ही, यह वास्तव में प्रश्न का उत्तर नहीं है। – dusktreader

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