2011-12-16 13 views
35

मुझे किसी अन्य शब्दकोश से शुरू होने वाले पायथन शब्दकोश को पॉप्युलेट करने में परेशानी हो रही है।पायथन शब्दकोश: TypeError: unhashable प्रकार: 'list'

मान लीजिए कि "स्रोत" शब्दकोश में कुंजी के रूप में स्ट्रिंग है और प्रति मान कस्टम ऑब्जेक्ट्स की एक सूची है।

मैं अपना लक्ष्य शब्दकोश बिल्कुल ठीक कर रहा हूं क्योंकि मैं अपना "स्रोत" शब्दकोश बना रहा हूं, यह कैसे संभव है यह काम नहीं कर रहा है?

मैं

TypeError: unhashable type: 'list' 

कोड:

aTargetDictionary = {} 
for aKey in aSourceDictionary: 
    aTargetDictionary[aKey] = [] 
    aTargetDictionary[aKey].extend(aSourceDictionary[aKey]) 

त्रुटि इस लाइन पर है: aTargetDictionary[aKey] = []

+5

मेरे टर्मिनल पर ठीक काम करता है। ** aSourceDictionary ** का उदाहरण दें जिसका आप –

उत्तर

31

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

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

the python doc के अनुसार:

The only types of values not acceptable as keys are values containing lists or dictionaries or other mutable types that are compared by value rather than by object identity, the reason being that the efficient implementation of dictionaries requires a key’s hash value to remain constant

+1

का उपयोग कर रहे हैं लेकिन इस उदाहरण में, कुंजी स्ट्रिंग हैं (जैसा कि प्रश्नकर्ता कहता है) – 0xc0de

+3

@ 0xc0de: त्रुटि कुछ कहती है, जबकि त्रुटि कुछ और कहती है, मुझे त्रुटि पर भरोसा है;) –

+0

मैंने कोशिश की और यह ठीक काम किया। मैंने छोटे variablenames का इस्तेमाल किया। – 0xc0de

7

यह वास्तव में नहीं बल्कि अजीब है।

यदि aSourceDictionary एक शब्दकोश था, तो मुझे विश्वास नहीं है कि आपके कोड के वर्णन के तरीके में विफल होना संभव है।

यह दो परिकल्पना की ओर जाता है:

  1. कोड आप वास्तव में चला रहे हैं अपने प्रश्न में कोड (शायद एक पहले या बाद में संस्करण?)

  2. aSourceDictionary में है के समान नहीं है तथ्य एक शब्दकोश नहीं है, लेकिन कुछ अन्य संरचना है (उदाहरण के लिए, एक सूची)।

+0

मैं पूरी तरह से सहमत हूं –

2

यह ठीक काम करता है: http://codepad.org/5KgO0b1G, अपने aSourceDictionary चर dict

aSourceDictionary = { 'abc' : [1,2,3] , 'ccd' : [4,5] } 
aTargetDictionary = {} 
for aKey in aSourceDictionary: 
     aTargetDictionary[aKey] = [] 
     aTargetDictionary[aKey].extend(aSourceDictionary[aKey]) 
print aTargetDictionary 
3

अपने विवरण के अनुसार के अलावा अन्य डेटाप्रकार हो सकता है, चीजों को न जोड़ें। यदि aSourceDictionary एक शब्दकोश है, तो आपके लूप के लिए ठीक से काम करना है।

>>> source = {'a': [1, 2], 'b': [2, 3]} 
>>> target = {} 
>>> for key in source: 
... target[key] = [] 
... target[key].extend(source[key]) 
... 
>>> target 
{'a': [1, 2], 'b': [2, 3]} 
>>> 
संबंधित मुद्दे