2010-08-04 35 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' 

Tôi nhận được lỗi trên trên dòng này:python: unhashable loại lỗi

(drug.upper Tôi cũng đã cố gắng() không có ngoặc vuông)
data=medications_minimum3(data,[drug.upper()],1) 

Đây là một bản xem trước của chức năng này:

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 

Có ai biết tôi đang làm gì sai ở đây không?

Tôi biết rằng những gì phải là sai lầm là cách tôi gọi chức năng này, bởi vì tôi gọi chức năng này từ một địa điểm khác nhau và nó hoạt động tốt:

d=medications_minimum3(c,drug_input,50) 

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn!

+0

Tại sao bạn có dấu ngoặc vuông quanh '[drug.upper()]' trong cuộc gọi không thành công? –

+1

Và nó cũng không được sử dụng trong hàm, không có tham chiếu đến drug_input – jcubic

+0

@jcubic: Tốt bắt. Điều đó có thể có nghĩa là mã đã được chỉnh sửa rất nhiều để đăng bài ở đây là vô giá trị. –

Trả lời

6

Tôi không nghĩ chuyển đổi thành bộ tuple là câu trả lời đúng.Bạn cần đi và xem nơi bạn đang gọi hàm và đảm bảo rằng c là danh sách các chuỗi hoặc bất kỳ thứ gì bạn đã thiết kế chức năng này để hoạt động với

Ví dụ: bạn có thể gặp lỗi này nếu bạn đã vượt qua [c] hàm thay vì c

16
counter[row[11]]+=1 

Bạn không hiển thị data là gì, nhưng dường như khi bạn lặp qua hàng của mình, row[11] được chuyển ra được một list. Danh sách là các đối tượng có thể thay đổi có nghĩa là chúng không thể được sử dụng làm khóa từ điển. Việc cố gắng sử dụng row[11] làm khóa sẽ gây ra defaultdict để khiếu nại rằng đó là một đối tượng có thể thay đổi, tức là không thể thực hiện được.

Sửa chữa dễ dàng nhất là thay đổi row[11] từ số list thành tuple. Hoặc bằng cách làm

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

hoặc bằng cách sửa chữa nó trong người gọi trước khi data được chuyển cho medications_minimum3. Một tuple chỉ đơn giản là một danh sách bất biến, vì vậy nó hoạt động giống như một danh sách ngoại trừ bạn không thể thay đổi nó khi nó được tạo ra.

+0

cảm ơn rất nhiều vì sự giúp đỡ của bạn, điều được đề cập trong câu hỏi, nó được gọi từ một nơi khác và nó hoạt động tốt –

+0

Đúng. Nếu 'c' chứa tuple thì hàm hoạt động tốt. Nếu nó chứa danh sách thì chức năng thất bại. Tất cả phụ thuộc vào những gì người gọi đi qua. –

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

row[11] không thể thực hiện được. Đó là một danh sách. Đó là chính xác (và chỉ) những gì các thông báo lỗi có nghĩa là. Bạn có thể không thích nó, nhưng đó là thông báo lỗi.

Làm điều này

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

Ngoài ra, đơn giản hóa.

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

điều như đã đề cập trong câu hỏi, nó được gọi từ một nơi khác và nó hoạt động tốt, truy cập là một bộ sưu tập –

+0

"điều được đề cập trong câu hỏi"? Gì? 'counter' là một bộ sưu tập. Chính xác. 'row [11]' là một danh sách. Đó là những gì thông báo lỗi của bạn nói. –

+0

đây là cách tiếp cận sai –

3

Khi Jim Garrison nói trong bình luận, không có lý do rõ ràng lý do tại sao bạn muốn làm cho một danh sách một phần tử ra khỏi drug.upper() (trong đó hàm ý ma túy là một chuỗi).

Nhưng đó không phải lỗi của bạn, vì chức năng của bạn medications_minimum3() thậm chí không sử dụng đối số thứ hai (điều bạn nên sửa).

TypeError: unhashable type: 'list' thường có nghĩa là bạn đang cố sử dụng danh sách làm đối số băm (như để truy cập từ điển). Tôi muốn tìm lỗi trong số counter[row[11]]+=1 - bạn có chắc chắn rằng row[11] có đúng loại không? Âm thanh với tôi nó có thể là một danh sách.

Các vấn đề liên quan