2010-08-04 22 views
13
Traceback (most recent call last): 
    File "<pyshell#80>", line 1, in <module> 
    do_work() 
    File "C:\pythonwork\readthefile080410.py", line 14, in do_work 
    populate_frequency5(e,data) 
    File "C:\pythonwork\readthefile080410.py", line 157, in populate_frequency5 
    data=medications_minimum3(data,[drug.upper()],1) 
    File "C:\pythonwork\readthefile080410.py", line 120, in medications_minimum3 
    counter[row[11]]+=1 
TypeError: unhashable type: 'list' 

मैं इस लाइन पर उपरोक्त त्रुटि हो रही है:अजगर: unhashable प्रकार की त्रुटि

data=medications_minimum3(data,[drug.upper()],1) 

(मैं भी कोशिश की है drug.upper() कोष्ठकों के बिना)

यहाँ एक पूर्वावलोकन है यह फ़ंक्शन:

def medications_minimum3(c,drug_input,sample_cutoff): #return sample cut off for # medications/physician 
    d=[] 
    counter=collections.defaultdict(int) 
    for row in c: 
    counter[row[11]]+=1 
    for row in c: 
    if counter[row[11]]>=sample_cutoff: 
     d.append(row) 
    write_file(d,'/pythonwork/medications_minimum3.csv') 
    return d 

क्या कोई जानता है कि मैं यहां क्या गलत कर रहा हूं? क्योंकि मैं एक अलग स्थान से इस समारोह फोन

मुझे पता है कि क्या गलत किया जाना चाहिए, जिस तरह से मैं इस समारोह बोल रहा हूँ है और यह ठीक काम करता है:

d=medications_minimum3(c,drug_input,50) 

आप आपकी मदद के लिए बहुत बहुत धन्यवाद!

+0

की बजाय फ़ंक्शन विफल कॉल में '[drug.upper()]' के आसपास स्क्वायर ब्रैकेट क्यों है? –

+1

और यह फ़ंक्शन में भी उपयोग नहीं किया जाता है, drug_input – jcubic

+0

@jcubic का कोई संदर्भ नहीं है: अच्छा पकड़। इसका शायद मतलब है कि कोड को बेकार होने के लिए यहां पोस्ट करने के लिए बहुत अधिक संपादित किया गया है। –

उत्तर

6

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

के साथ काम करने के लिए इस समारोह के लिए बनाया गया उदाहरण के लिए यदि आप इस त्रुटि आ सकती है यदि आप के लिए [c] पारित कर दिया है की जरूरत है c

16
counter[row[11]]+=1 

आप नहीं दिखा क्या data है, लेकिन जाहिरा तौर पर जब आप अपनी पंक्तियों के माध्यम से लूप, row[11] बाहर घूम रहा है एक list किया जाना है। सूचियां परिवर्तनीय वस्तुएं हैं जिसका अर्थ है कि उन्हें शब्दकोश कुंजी के रूप में उपयोग नहीं किया जा सकता है। row[11] का उपयोग करने की कोशिश करने के कारण defaultdict यह शिकायत करने के लिए है कि यह एक उत्परिवर्तनीय है, यानी unhashable, ऑब्जेक्ट।

सबसे आसान फिक्स row[11] को list से tuple पर बदलना है। या तो

counter[tuple(row[11])] += 1 

करके या फोन करने वाले में यह तय करने से पहले datamedications_minimum3 में भेजा जाता है के द्वारा। एक ट्यूपल बस एक अपरिवर्तनीय सूची है, इसलिए यह एक सूची की तरह व्यवहार करता है सिवाय इसके कि आप इसे बनाए जाने के बाद इसे बदल नहीं सकते हैं।

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद, सवाल इस बात में उल्लिखित है, इसे एक अलग जगह से कहा जाता है और यह –

+0

ठीक काम करता है। यदि 'c' में tuples शामिल हैं तो फ़ंक्शन ठीक काम करता है। यदि इसमें सूचियां हैं तो फ़ंक्शन विफल हो जाता है। यह सब इस बात पर निर्भर करता है कि कॉलर किस प्रकार गुजरता है। –

0
File "C:\pythonwork\readthefile080410.py", line 120, in medications_minimum3 
    counter[row[11]]+=1 
TypeError: unhashable type: 'list' 

row[11] असहनीय है। यह एक सूची है। यह ठीक है (और केवल) त्रुटि संदेश का क्या अर्थ है। आपको शायद यह पसंद न हो, लेकिन यह त्रुटि संदेश है।

इसके अलावा इस

counter[tuple(row[11])]+=1 

करते हैं, को आसान बनाने में।

d= [ row for row in c if counter[tuple(row[11])]>=sample_cutoff ] 
+0

इस सवाल में उल्लिखित बात यह है कि इसे एक अलग जगह से बुलाया जाता है और यह ठीक काम करता है, काउंटर एक संग्रह है –

+0

"बात इस सवाल में उल्लिखित है"? क्या? 'काउंटर 'एक संग्रह है। सही बात। 'पंक्ति [11] 'एक सूची है। यही आपका त्रुटि संदेश कहता है। –

+0

यह गलत दृष्टिकोण है –

3

जिम गैरीसन के रूप में टिप्पणी में कहा, कोई स्पष्ट कारण है कि आप एक तत्व सूची drug.upper() से बाहर बनाने चाहते हैं (जो दवा का तात्पर्य एक स्ट्रिंग है)।

लेकिन यह आपकी त्रुटि नहीं है, क्योंकि आपका फ़ंक्शन medications_minimum3() दूसरे तर्क का उपयोग भी नहीं करता है (आपको कुछ ठीक करना चाहिए)।

TypeError: unhashable type: 'list' आमतौर पर इसका मतलब है कि आप एक हैश तर्क के रूप में एक सूची का उपयोग करने की कोशिश कर रहे हैं (जैसे एक शब्दकोश तक पहुंचने के लिए)। मैं counter[row[11]]+=1 में त्रुटि की तलाश करूंगा - क्या आप वाकई row[11] सही प्रकार का है? मुझे लगता है कि यह एक सूची हो सकती है।

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