Bạn đang cố gắng sử dụng một dict
như một chìa khóa để dict
khác là gì hoặc trong một số set
. Điều đó không hoạt động vì các khóa phải được băm. Theo nguyên tắc chung, chỉ có các đối tượng bất biến (chuỗi, số nguyên, phao nổi, frozensets, tuples của bất biến) là hashable (mặc dù có thể có ngoại lệ). Vì vậy, điều này không hoạt động:
>>> dict_key = {"a": "b"}
>>> some_dict[dict_key] = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
Để sử dụng dict làm khóa bạn cần biến nó thành thứ gì đó có thể được băm trước. Nếu dict bạn muốn sử dụng như chìa khóa bao gồm chỉ có giá trị bất biến, bạn có thể tạo ra một đại diện hashable của nó như thế này:
>>> key = frozenset(dict_key.items())
Bây giờ bạn có thể sử dụng key
như một chìa khóa trong một dict
hoặc set
:
>>> some_dict[key] = True
>>> some_dict
{frozenset([('a', 'b')]): True}
Tất nhiên bạn cần phải lặp lại các tập thể dục bất cứ khi nào bạn muốn tìm kiếm một cái gì đó sử dụng một dict:
>>> some_dict[dict_key] # Doesn't work
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> some_dict[frozenset(dict_key.items())] # Works
True
Nếu 012.bạn muốn sử dụng như khóa có giá trị là bản thân dicts và/hoặc danh sách, bạn cần phải đệ quy "đóng băng" chìa khóa tiềm năng. Dưới đây là một điểm khởi đầu:
def freeze(d):
if isinstance(d, dict):
return frozenset((key, freeze(value)) for key, value in d.items())
elif isinstance(d, list):
return tuple(freeze(value) for value in d)
return d
RTD http://docs.python.org/2.7/library/stdtypes.html#mapping-types-dict – iMom0
Nó muốn được hữu ích để hiển thị các báo cáo lỗi vì vậy chúng tôi có thể nhìn thấy mà dòng có vấn đề ... – drevicko