Khóa python có thể là danh sách không?

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?

  1. 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
  2. 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

Một giá trị quan trọng có thể là một danh sách?

Bạn không thể sử dụng danh sách làm khóa , vì danh sách có thể được sửa đổi tại chỗ bằng cách sử dụng phép gán chỉ mục, phép gán lát cắt hoặc các phương thức như append[] và expand[]. Tốt nhất là coi từ điển như một bộ chìa khóa. các cặp giá trị, với yêu cầu các khóa là duy nhất [trong một từ điển].

Khóa từ điển có thể là một danh sách không?

Danh sách dưới dạng khóa từ điển

Tại sao không thể sử dụng danh sách làm khóa?

Bạn không thể sử dụng danh sách làm khóa vì danh sách có thể thay đổi . Tương tự, bạn không thể sử dụng một bộ làm khóa nếu bất kỳ phần tử nào của nó là danh sách. [Bạn chỉ có thể sử dụng một bộ làm khóa nếu tất cả các phần tử của nó là bất biến. ]

Những loại khóa nào có thể là Python?

Khóa phải là bất biến . Chúng ta cũng có thể sử dụng các bộ dữ liệu làm khóa nhưng chúng chỉ được chứa các chuỗi, số nguyên hoặc các bộ dữ liệu khác. Strings and numbers are the two most commonly used data types as dictionary keys. We can also use tuples as keys but they must contain only strings, integers, or other tuples.

Chủ Đề