2012-04-30 16 views
10

काम करता है पाइथन में एक असंगतता प्रतीत होती है कि यह किस प्रकार की चाबियों के लिए स्वीकार करेगा। या, दूसरे शब्दों में कहें, यह कुंजी के कुछ प्रकार dicts को परिभाषित करने की एक तरह से की अनुमति देता है, लेकिन दूसरों में:पायथन Syntax dictr के साथ शब्द (1 = ...), लेकिन {1: ...}

>>> d = {1:"one",2:2} 
>>> d[1] 
'one' 
>>> e = dict(1="one",2=2) 
    File "<stdin>", line 1 
    SyntaxError: keyword can't be an expression 

{...} अंकन अधिक मौलिक है, और dict(...) बस वाक्यात्मक चीनी? क्या ऐसा इसलिए है क्योंकि पाइथन के लिए parse dict(1="one") पर कोई रास्ता नहीं है?

मैं उत्सुक हूँ ...

उत्तर

17

यह एक dict मुद्दा है, लेकिन अजगर वाक्य रचना के एक विरूपण साक्ष्य नहीं है: कीवर्ड तर्क मान्य पहचानकर्ता होना चाहिए, और 1 और 2 नहीं हैं।

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

9

dict फ़ंक्शन कॉल है, और फ़ंक्शन कीवर्ड पहचानकर्ता होना चाहिए।

1

आप documentation पढ़ा, तो आप सीखना होगा कि dict = {stringA = 1, stringB = 2} अंकन मान्य है जब कुंजी सरल तार कर रहे हैं:

कुंजी सरल तार कर रहे हैं, यह कभी कभी कीवर्ड तर्कों का उपयोग जोड़े निर्दिष्ट करने के लिए आसान है :

>>> 
>>> dict(sape=4139, guido=4127, jack=4098) 
{'sape': 4139, 'jack': 4098, 'guido': 4127} 

के बाद से पूर्णांकों (या अन्य संख्या) मान्य नहीं कीवर्ड तर्क हैं, dict = {1 = 2, 3 = 4} एक समारोह के लिए किसी भी कॉल के रूप में असफल हो जायेगी होगा अगर तुम

>>> def test(**kwargs): 
...  for arg in kwargs: 
...   print arg, kwargs[arg] 
... 
>>> test(a=2,b=3) 
a 2 
b 3 
>>> test(1=2, 3=4) 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 
1

के रूप में अन्य जवाब कहा है, dict एक समारोह कॉल है: जबकि यह एक संख्या के साथ नामकरण इसे करने के लिए एक तर्क पारित कर दिया। इसमें तीन वाक्य रचनात्मक रूप हैं।

प्रपत्र:

dict(**kwargs) -> new dictionary initialized with the name=value pairs 
    in the keyword argument list. For example: dict(one=1, two=2) 

कुंजी (या name के रूप में इस मामले में इस्तेमाल किया) वैध अजगर identifiers होना चाहिए, और ints मान्य नहीं हैं।

>>> def f(**kw): pass 
... 
>>> f(one=1) # this is OK 
>>> f(1=one) # this is not 
    File "<stdin>", line 1 
SyntaxError: keyword can't be an expression 

हालांकि, वहाँ आप के दो अन्य वाक्यात्मक रूपों का उपयोग कर सकते हैं:

सीमा न केवल समारोह dict आप यह इतना तरह का प्रदर्शन कर सकते है।

है:

dict(iterable) -> new dictionary initialized as if via: 
     d = {} 
     for k, v in iterable: 
      d[k] = v 

उदाहरण:

>>> dict([(1,'one'),(2,2)]) 
{1: 'one', 2: 2} 

और एक मानचित्रण से:

dict(mapping) -> new dictionary initialized from a mapping object's 
    (key, value) pairs 

उदाहरण:

>>> dict({1:'one',2:2}) 
{1: 'one', 2: 2} 
,210

इतना (एक dict शाब्दिक से एक dict) की तरह लग सकता है जबकि नहीं ध्यान रखें कि Counter और defaultdict मैपिंग कर रहे हैं में रखने के लिए और यह कैसे आप एक dict के लिए उन में से एक भी बयान देगी:

>>> from collections import Counter 
>>> Counter('aaaaabbbcdeffff') 
Counter({'a': 5, 'f': 4, 'b': 3, 'c': 1, 'e': 1, 'd': 1}) 
>>> dict(Counter('aaaaabbbcdeffff')) 
{'a': 5, 'c': 1, 'b': 3, 'e': 1, 'd': 1, 'f': 4} 
संबंधित मुद्दे