2011-12-16 41 views
35

Tôi đang gặp khó khăn trong việc nhập từ điển python bắt đầu từ một từ điển khác.Từ điển Python: LoạiError: loại không thể loại bỏ: 'list'

Giả sử rằng từ điển "nguồn" có chuỗi là khóa và có danh sách các đối tượng tùy chỉnh cho mỗi giá trị.

Tôi đang tạo từ điển mục tiêu của mình chính xác như tôi đã tạo từ điển "nguồn" của tôi như thế nào có thể điều này không hoạt động?

tôi nhận được

TypeError: unhashable type: 'list' 

Code:

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

Lỗi này là trên dòng này: aTargetDictionary[aKey] = []

+5

hoạt động tốt trên thiết bị đầu cuối của tôi. Ví dụ về ** aSourceDictionary ** mà bạn đang sử dụng –

Trả lời

31

Các lỗi bạn đã cho là do thực tế rằng trong python, phím từ điển phải là loại bất biến (nếu khóa có thể thay đổi, sẽ có vấn đề) và danh sách là loại có thể thay đổi.

Lỗi của bạn cho biết bạn cố gắng sử dụng danh sách làm khóa từ điển, bạn sẽ phải thay đổi danh sách thành bộ dữ liệu nếu bạn muốn đặt chúng làm khóa trong từ điển của mình.

Theo 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

Nhưng trong ví dụ này, các phím là chuỗi (như người hỏi nói) – 0xc0de

+3

@ 0xc0de: mã nói điều gì đó trong khi lỗi nói điều gì khác, tôi tin tưởng lỗi;) –

+0

Tôi đã thử và nó hoạt động tốt. Tôi đã sử dụng variablenames nhỏ. – 0xc0de

7

Đây thực sự là khá kỳ quặc.

Nếu aSourceDictionary là từ điển, tôi không tin rằng mã của bạn có thể bị lỗi theo cách bạn mô tả.

Điều này dẫn đến hai giả thuyết:

  1. Mã bạn đang thực sự chạy là không giống với mã trong câu hỏi của bạn (có lẽ một phiên bản sớm hơn hoặc muộn?)

  2. aSourceDictionary là trong thực tế không phải là một từ điển, nhưng là một số cấu trúc khác (ví dụ, một danh sách).

+0

Tôi hoàn toàn đồng ý –

2

Nó hoạt động tốt: http://codepad.org/5KgO0b1G, biến aSourceDictionary của bạn có thể có kiểu dữ liệu khác ngoài dict

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

Theo mô tả của bạn, mọi thứ không thêm lên. Nếu aSourceDictionary là từ điển, thì vòng lặp for của bạn phải hoạt động bình thường.

>>> 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]} 
>>> 
Các vấn đề liên quan