Bạn có thể sử dụng danh sách Python làm giá trị từ điển. Trên thực tế, bạn có thể sử dụng các đối tượng Python tùy ý làm giá trị từ điển và tất cả các đối tượng có thể băm làm khóa từ điển. Bạn có thể xác định danh sách [1, 2]
dưới dạng giá trị chính tả với dict[key] = [1, 2]
hoặc với
friends = dict[] friends['Alice'] = ['Bob', 'Carl'] friends['Bob'] = ['Alice'] friends['Carl'] = [] print['Alice friends: ', friends['Alice']] # Alice friends: ['Bob', 'Carl'] print['Bob friends: ', friends['Bob']] # Bob friends: ['Alice'] print['Carl friends: ', friends['Carl']] # Carl friends: []0
Đây là một ví dụ cụ thể cho thấy cách tạo một từ điển
friends = dict[] friends['Alice'] = ['Bob', 'Carl'] friends['Bob'] = ['Alice'] friends['Carl'] = [] print['Alice friends: ', friends['Alice']] # Alice friends: ['Bob', 'Carl'] print['Bob friends: ', friends['Bob']] # Bob friends: ['Alice'] print['Carl friends: ', friends['Carl']] # Carl friends: []1 trong đó mỗi giá trị từ điển thực tế là một danh sách bạn bè
friends = {'Alice': ['Bob', 'Carl'], 'Bob': ['Alice'], 'Carl': []} print['Alice friends: ', friends['Alice']] # Alice friends: ['Bob', 'Carl'] print['Bob friends: ', friends['Bob']] # Bob friends: ['Alice'] print['Carl friends: ', friends['Carl']] # Carl friends: []
Lưu ý rằng bạn cũng có thể gán danh sách làm giá trị của các khóa cụ thể bằng cách sử dụng thao tác gán từ điển như vậy
friends = dict[] friends['Alice'] = ['Bob', 'Carl'] friends['Bob'] = ['Alice'] friends['Carl'] = [] print['Alice friends: ', friends['Alice']] # Alice friends: ['Bob', 'Carl'] print['Bob friends: ', friends['Bob']] # Bob friends: ['Alice'] print['Carl friends: ', friends['Carl']] # Carl friends: []
Tôi có thể sử dụng Danh sách làm Khóa chính tả không?
Bạn không thể sử dụng danh sách làm khóa từ điển vì danh sách có thể thay đổi và do đó không thể băm được. Vì từ điển được xây dựng trên bảng băm, tất cả các khóa phải có thể băm được nếu không Python sẽ đưa ra thông báo lỗi
Đây là một ví dụ
d = dict[] my_list = [1, 2, 3] d[my_list] = 'abc'
Điều này dẫn đến thông báo lỗi sau
Traceback [most recent call last]: File "C:\Users\xcent\Desktop\code.py", line 3, in d[my_list] = 'abc' TypeError: unhashable type: 'list'
Để khắc phục điều này, hãy chuyển đổi danh sách thành bộ dữ liệu Python và sử dụng bộ dữ liệu Python làm khóa từ điển. Các bộ dữ liệu trong Python là bất biến và có thể băm được, do đó, có thể được sử dụng làm phần tử tập hợp hoặc khóa từ điển
Đây là ví dụ tương tự sau khi chuyển đổi danh sách thành một bộ—nó hoạt động. 🎉
d = dict[] my_list = [1, 2, 3] my_tuple = tuple[my_list] d[my_tuple] = 'abc'
Trước khi đi, có thể bạn muốn tham gia học viện email miễn phí của chúng tôi gồm những người học đầy tham vọng như bạn? . Chúng tôi cũng có cheat sheet. 👇
1 >>> l = [1, 2] 2 >>> d = {} 3 >>> d[l] = 42 4 >>> l.append[3] 5 >>> d[l] 6 Traceback [most recent call last]: 7 File "", line 1, in ? 8 KeyError: [1, 2, 3] 9 >>> d[[1, 2]] 10 Traceback [most recent call last]: 11 File "", line 1, in ? 12 KeyError: [1, 2]
trong đó giá trị 42 không còn nữa vì danh sách băm thành cùng một giá trị, [1, 2], không tương đương với danh sách đã sửa đổi và giá trị tương đương với danh sách đã sửa đổi, [1, 2, 3] . Vì từ điển không biết khi nào một đối tượng khóa được sửa đổi, nên các lỗi như vậy chỉ có thể được tạo ra khi tra cứu khóa chứ không phải tại thời điểm sửa đổi đối tượng, điều này có thể khiến các lỗi như vậy khá khó gỡ lỗi
Nhận thấy rằng cả hai cách băm danh sách đều có một số tác dụng phụ không mong muốn, rõ ràng hơn là tại sao Python có lập trường rằng
Không nên sử dụng loại danh sách tích hợp làm khóa từ điển
Lưu ý rằng vì các bộ dữ liệu là bất biến, nên chúng không gặp rắc rối với danh sách - chúng có thể được băm theo nội dung của chúng mà không phải lo lắng về việc sửa đổi. Do đó, trong Python, chúng cung cấp phương thức __hash__ hợp lệ và do đó có thể sử dụng làm khóa từ điển
Các loại do người dùng xác định làm khóa từ điển
Còn các trường hợp của các loại do người dùng xác định thì sao?
Theo mặc định, tất cả các loại do người dùng xác định đều có thể sử dụng làm khóa từ điển với hash[object] mặc định là id[object] và cmp[object1, object2] mặc định là cmp[id[object1], id[object2]]. Đề xuất tương tự này đã được thảo luận ở trên cho các danh sách và thấy không đạt yêu cầu. Tại sao các loại do người dùng xác định lại khác nhau?
- Trong trường hợp một đối tượng phải được đặt trong ánh xạ, nhận dạng đối tượng thường quan trọng hơn nhiều so với nội dung đối tượng
Trong trường hợp nội dung đối tượng thực sự quan trọng, cài đặt mặc định có thể được xác định lại bằng cách ghi đè __hash__ và __cmp__ hoặc __eq__
Lưu ý rằng cách thực hành tốt hơn thường là khi một đối tượng được liên kết với một giá trị, chỉ cần gán giá trị đó làm một trong các thuộc tính của đối tượng