2012-07-27 15 views
9

क्या पाइथन में यूनिकोड वर्णों को शब्दकोश के लिए कुंजी के रूप में उपयोग करना संभव है? मेरे पास यूनिकोड में सिरिलिक शब्द हैं जिन्हें मैंने चाबियों के रूप में उपयोग किया था। किसी कुंजी द्वारा मूल्य प्राप्त करने का प्रयास करते समय, मुझे निम्न ट्रेसबैक मिलता है:यूनिकोड में कुंजियों के साथ शब्दकोश

Traceback (most recent call last): 
File "baseCreator.py", line 66, in <module> 
    createStoresTable() 
File "baseCreator.py", line 54, in createStoresTable 
    region_id = regions[region] 
KeyError: u'\u041c\u0438\u043d\u0441\u043a/\u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0439\xa0' 
+1

मुझे इसी तरह की समस्याएं थीं जब मैंने कुछ "स्ट्रिंग" के अलग-अलग एन्कोडेड संस्करणों के साथ कुछ शब्दकोश बनाए और पूछे। यह देखने के लिए कुछ है। उपयोगी तरीके 'str.encode' और' str.decode' स्ट्रिंग विधियां हैं। और, ज़ाहिर है, यह संभव है कि कुंजी बस शब्दकोश में मौजूद न हो, इस प्रकार कुंजी के वास्तविक एन्कोडिंग से कोई लेना-देना नहीं है। – heltonbiker

+0

पायथन 3.2 में यूनिकोड कुंजी के साथ समस्या हो सकती है। – JDong

+0

आपने इसे कैसे हल किया? मेरे पास 3.4.2 में एक ही समस्या है। मैंने चाबियाँ मुद्रित की हैं और चाबियां मौजूद हैं और अभी भी उपर्युक्त त्रुटि प्राप्त कर रही हैं। कोई भी अपडेट कृपया? – Vinodh

उत्तर

6

हां, यह संभव है। आपके द्वारा प्राप्त की जा रही त्रुटि का अर्थ है कि आप जिस कुंजी का उपयोग कर रहे हैं वह आपके शब्दकोश में मौजूद नहीं है।

डीबग करने के लिए, print अपने शब्दकोश में डालने का प्रयास करें; आपको प्रत्येक कुंजी का प्रतिनिधि दिखाई देगा जो दिखाएगा कि वास्तविक कुंजी कैसा दिखता है।

1

पायथन 2.x दोनों चाबियों को दोबारा जोड़कर परीक्षण करता है, यह जांचने के प्रयोजनों के लिए दो कुंजी की तुलना करता है कि कोई कुंजी पहले से मौजूद है, किसी मान को एक्सेस कर रहा है या मूल्य को ओवरराइट कर रहा है। एक कुंजी यूनिकोड के रूप में संग्रहीत की जा सकती है, लेकिन दो अलग-अलग यूनिकोड तारों को दोनों को चाबियाँ के रूप में उपयोग नहीं किया जा सकता है यदि वे समान बाइटरीज़ को कम करते हैं।

In []: d = {'a': 1, u'a': 2} 
In []: d 
Out[]: {'a': 2} 

आप कुछ अर्थों में यूनिकोड कुंजी का उपयोग कर सकते हैं।

यूनिकोड कुंजी यूनिकोड में रखा जाता है:

In []: d2[u'a'] 
Out[]: 1 

In []: d2['a'] 
Out[]: 1 

कुंजी या का उपयोग करना:

In []: d2 = {u'a': 1} 
In []: d2 
Out[]: {u'a': 1} 

आप किसी भी यूनिकोड स्ट्रिंग या bytestring कि "बराबर है" मौजूदा कुंजी के साथ मूल्य तक पहुँच सकते हैं कोई भी नया मूल्य लिखने के लिए "बराबर" कुछ भी सफल होगा और मौजूदा कुंजी को बनाए रखेगा:

In []: d2['a'] = 5 
In []: d2 
Out[]: {u'a': 5} 

क्योंकि मौजूदा कुंजी में 'a' की तुलना True थी, उस मौजूदा यूनिकोड कुंजी से संबंधित मान 5 के साथ प्रतिस्थापित किया गया था। प्रारंभिक उदाहरण में, मैं को d के लिए शाब्दिक में प्रदान की गई दूसरी कुंजीसचमुच पहले निर्दिष्ट कुंजी पर तुलना करता है, इसलिए बाइटस्ट्रिंग 'a' को कुंजी के रूप में बनाए रखा गया था लेकिन मान 2 के साथ ओवरराइट किया गया था।

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