Bạn nói rằng bạn có một từ điển với nhiều loại chính. Trong Python, nó không quan trọng loại khóa nào miễn là chúng có thể băm. Có nghĩa là những điều sau đây là hoàn toàn chấp nhận được:
my_dict={}
my_dict[1]=[1,2,3]
my_dict['s']='hello'
my_dict[[0,2]]={'a':1,2:'b'}
print[my_dict]
{1: [1, 2, 3],
's': 'hello',
[0, 2]: {'a': 1, 2: 'b'}
}
Tuy nhiên, bạn nói rằng các khóa của bạn là danh sách các giá trị khác. Bởi vì một danh sách là có thể thay đổi, nó không thể được sử dụng làm chìa khóa trong một dict:
my_dict[[1,2]]='coords'
TypeError: unhashable type: 'list'
Giải pháp sẽ là chuyển đổi các khóa danh sách của bạn thành các khóa tuple, như trong ví dụ thứ 3 của tôi ở trên, có cấu trúc tương tự nhưng không thể thay đổi
Hầu như bất kỳ loại giá trị nào cũng có thể được sử dụng làm khóa từ điển trong Python. Bạn thậm chí có thể sử dụng các đối tượng tích hợp như các loại và chức năng. Tuy nhiên, có một vài hạn chế rằng các khóa từ điển phải tuân thủ.
Đầu tiên, một khóa nhất định chỉ có thể xuất hiện trong một từ điển một lần. Các khóa trùng lặp không được phép. Một từ điển ánh xạ từng khóa theo giá trị tương ứng, do đó, nó không có ý nghĩa gì khi ánh xạ một khóa cụ thể hơn một lần. Nếu bạn chỉ định khóa lần thứ hai trong quá trình tạo từ điển ban đầu, thì lần xuất hiện thứ hai sẽ ghi đè lên thứ nhất.
Thứ hai, một khóa từ điển phải thuộc loại bất biến. Ví dụ: bạn có thể sử dụng số nguyên, phao, chuỗi hoặc boolean làm khóa từ điển. Tuy nhiên, cả danh sách và từ điển khác đều không thể đóng vai trò là khóa từ điển, bởi vì danh sách và từ điển đều có thể thay đổi. Mặt khác, các giá trị có thể là bất kỳ loại nào và có thể được sử dụng nhiều lần.
Ảnh của Waldemar Brandt trên unplash Từ điển là một cấu trúc dữ liệu thiết yếu trong Python và bất kỳ ngôn ngữ lập trình hiện đại nào khác, chẳng hạn như JavaScript và Swift. Chúng còn được gọi là bản đồ, băm, bảng băm và các mảng kết hợp. Mặc dù các tên khác nhau, chúng có chung cùng một tính năng-các yếu tố của chúng là các cặp giá trị chính. Nói một cách đơn giản, một từ điển bao gồm một hoặc nhiều mục và chúng ta có thể sử dụng các khóa duy nhất để xác định từng yếu tố này. Sử dụng một khóa cụ thể, chúng tôi sẽ có thể tìm thấy giá trị được liên kết với khóa đó. Nếu bạn đã từng học Python, có lẽ bạn đã biết rằng Kiểu dữ liệu Có một cái nhìn nhanh về ba loại dữ liệu từ điển phổ biến trong Python.
dict
là một trong những loại dữ liệu tích hợp được sử dụng phổ biến nhất. Nó là viết tắt của từ điển, nhưng bạn có biết rằng có các loại dữ liệu từ điển khác trong Python không? Hãy cùng tìm hiểu những gì họ là trong bài viết này. Chúng tôi cũng sẽ bao gồm các cách sử dụng cơ bản của riêng họ.Các dict-in-in
dict
là cấu trúc dữ liệu ánh xạ tích hợp duy nhất như là một phần của thư viện tiêu chuẩn Python. Việc sử dụng chính của nó rất đơn giản, như được tóm tắt dưới đây.
Một số điểm cần thiết được liệt kê dưới đây liên quan đến việc sử dụng phổ biến của kiểu dữ liệu dict
.
- Các chìa khóa cần phải được băm. Một đối tượng có thể băm nếu loại của nó thực hiện phương thức
2 sao cho giá trị băm có thể được tính toán cho từng đối tượng của loại. Điều quan trọng, các đối tượng có thể băm không bao giờ nên thay đổi trong vòng đời của chúng, điều đó có nghĩa là các vật thể có thể thay đổi nhưmy_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
3 vàmy_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
dict
không thể băm và do đó có thể được sử dụng làm khóa, như hình dưới đây.
>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
- Nếu chúng ta truy cập một giá trị bằng phương pháp khung vuông [nghĩa là,
5], trình thông dịch sẽ tăngmy_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
6 nếu khóa không có trongmy_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
dict
. Do đó, một cách an toàn hơn để truy cập một giá trị khóa cụ thể là sử dụng phương thức
8. Khi khóa không tồn tại,my_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
9 sẽ được trả về trừ khi giá trị mặc định được đặt và trả về tương ứng.my_dict[[1,2]]='coords' TypeError: unhashable type: 'list'
>>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
- Chúng ta có thể sử dụng các phương thức
>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
0,
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
1 và
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
2 để truy cập các khóa, giá trị và các cặp giá trị khóa ____ 9 [được hiển thị dưới dạng bộ dữ liệu], tương ứng. Chúng được biết đến là các đối tượng xem, điều đó có nghĩa là chúng chỉ là những quan điểm năng động của
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'dict
và chúng thay đổi khidict
thay đổi. Bên cạnh đó, những quan điểm này là lặp đi lặp lại để tất cả chúng có thể được sử dụng trong các vòng lặp.
>>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
DefaultDict
Là một lớp con của lớp dict
tích hợp, một đối tượng
>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7 đôi khi được sử dụng làm đối tượng giống như từ điển. Cần lưu ý rằng kiểu dữ liệu >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7 không phải là một phần của thư viện tiêu chuẩn và nó có sẵn trong mô -đun >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
9.Loại
>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7 có cùng chức năng với lớp dict
, ngoại trừ có thuộc tính >>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
2. Chất xây dựng ____ 27 là >>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
4. Cụ thể, giá trị mặc định của đối số >>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
2 là my_dict[[1,2]]='coords'
TypeError: unhashable type: 'list'
9. Khi nó được thiết lập, nó được gọi là mà không có đối số để tạo giá trị mặc định khi một khóa nhất định không có mặt trong >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7. Một ví dụ được đưa ra dưới đây.>>> from collections import defaultdict
>>> letter_counts = defaultdict[int]
>>> for i in 'abbcccddddeeeee':
... letter_counts[i] += 1
...
>>> letter_counts.items[]
dict_items[[['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]]]
Như được hiển thị ở trên, khi
>>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
8 không có bất kỳ khóa nào, truy cập giá trị của khóa bị thiếu [ví dụ: 'A'], >>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
2 [tức là, >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
0] được gọi là 0 được trả về, vì >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
1 trả về 0. , tính năng nổi bật nhất của >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7 là trả về các giá trị mặc định bằng cách gọi hàm >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
3 cho các khóa bị thiếu.to return default values by calling the >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
3 function for missing keys.Một điều cần lưu ý rằng đối số
>>> dict_missing = {'zero': 0, 'one': 1}
>>> dict_missing['two']
Traceback [most recent call last]:
File "", line 1, in
KeyError: 'two'
>>> print[dict_missing.get['two']]
None
>>> print[dict_missing.get['two', -1]]
-1
2 chỉ có thể được đặt với một cái gì đó có thể gọi được, như một hàm hoặc một lambda. Vì vậy, ví dụ trên có thể được viết lại như dưới đây. Chúng tôi sử dụng hàm Lambda >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
5 để thay thế hàm >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
0.>>> from collections import defaultdict
>>> letter_counts = defaultdict[lambda: 0]
>>> for i in 'abbcccddddeeeee':
... letter_counts[i] += 1
...
>>> letter_counts.items[]
dict_items[[['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]]]
Các đơn đặt hàng
Một loại giống như từ điển hữu ích khác là
>>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
7, cũng có sẵn trong mô-đun >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
9 dưới dạng loại >>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list'
7. Sự khác biệt chính giữa loại >>> dict_iterable = {'zero': 0, 'one': 1}
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
7 và dict
được sử dụng là trước đây nhớ thứ tự của các mục. Tuy nhiên, kể từ Python 3.7, loại dict
cũng đã thực hiện thứ tự các cặp giá trị khóa dựa trên trình tự chèn của chúng, do đó sự khác biệt này về mặt theo dõi thứ tự đã biến mất. Bên cạnh đó, có hai điều đáng chú ý.- Họ thực hiện phương pháp
>>> from collections import defaultdict
3 khác nhau. Trong
>>> letter_counts = defaultdict[int]
>>> for i in 'abbcccddddeeeee':
... letter_counts[i] += 1
...
>>> letter_counts.items[]
dict_items[[['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]]]dict
[Python 3.7+], phương pháp này sẽ loại bỏ và trả về một cặp giá trị khóa bằng LIFO [tức là, cuối cùng theo thứ tự đầu tiên]. Tuy nhiên, trong>>> dict_iterable = {'zero': 0, 'one': 1}
7, có một đối số Boolean cuối cùng mà chúng ta có thể đặt ra. Khi đó là sự thật, cặp giá trị khóa được xóa và trả về sẽ là thứ tự LIFO, khi nó sai, thứ tự sẽ là FIFO [tức là, trước tiên] Chúng tôi muốn sử dụng để loại bỏ các mục. Các ví dụ thích hợp được đưa ra dưới đây.
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
two
>>> from collections import OrderedDict
>>> dict_remove = {0: 'zero', 1: 'one', 2: 'two'}
>>> dict_remove.popitem[]
[2, 'two']
>>> ordereddict_remove = OrderedDict[{0: 'zero', 1: 'one', 2: 'two'}]
>>> ordereddict_remove.popitem[last=False]
[0, 'zero']
>>> ordereddict_remove.popitem[last=True]
[2, 'two']
- Họ thực hiện thử nghiệm bình đẳng khác nhau. Khi chúng tôi so sánh hai
>>> dict_iterable = {'zero': 0, 'one': 1}
7, thứ tự của các mục quan trọng. Tuy nhiên, khi chúng tôi so sánh với
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
twodict
, thứ tự của các mặt hàng không quan trọng. Ngoài các so sánh trong các loại dữ liệu tương ứng của chúng, thứ tự không quan trọng khi chúng ta so sánh>>> dict_iterable = {'zero': 0, 'one': 1}
7 với
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
twodict
. Dưới đây là một số ví dụ.
>>> ordereddict0 = OrderedDict[{0: 0, 1: 1}]
>>> ordereddict1 = OrderedDict[{1: 1, 0: 0}]
>>> ordereddict2 = OrderedDict[{0: 0, 1: 1}]
>>> dict0 = {0: 0, 1: 1}
>>> dict1 = {1: 1, 0: 0}
>>> ordereddict0 == ordereddict1
False
>>> ordereddict0 == ordereddict2
True
>>> dict0 == dict1
True
>>> ordereddict0 == dict0
True
>>> ordereddict0 == dict1
True
Takeaways
Trong bài viết này, chúng tôi đã học được ba từ điển được sử dụng phổ biến nhất trong Python. Khi nào chúng ta biết sử dụng cái nào? Dưới đây là một số hướng dẫn chung.
- Trong hầu hết các trường hợp, chúng ta có thể sử dụng kiểu dữ liệu
dict
tích hợp. Không chỉ bởi vì nó cung cấp nhiều chức năng nhất cho nhu cầu của chúng tôi, mà còn bởi vì nó không yêu cầu nhập bất kỳ mô -đun nào. - Khi chúng ta xây dựng một từ điển, nếu chúng ta biết giá trị mặc định nào, chúng ta nên đặt cho một khóa bị thiếu, chúng ta nên xem xét sử dụng kiểu dữ liệu
>>> dict_example = {1: 1, 'three': 3, [4, 5]: 0}
7, vì nó được tối ưu hóa cho việc sử dụng này.
>>> dict_example[[1,2]] = 5
Traceback [most recent call last]:
File "", line 1, in
TypeError: unhashable type: 'list' - Nhìn chung,
>>> dict_iterable = {'zero': 0, 'one': 1}
7 và
>>> dict_iterable_keys = dict_iterable.keys[]
>>> dict_iterable_keys
dict_keys[['zero', 'one']]
>>> dict_iterable['two']=2
>>> dict_iterable_keys
dict_keys[['zero', 'one', 'two']]
>>> for i in dict_iterable_keys:
... print[i]
...
zero
one
twodict
có các cách sử dụng tương tự, vì vậy chúng ta có thể sử dụng chúng thay thế cho nhau trừ khi thứ tự của các từ điển được quan tâm khi chúng ta chạy thử nghiệm bình đẳng.
Cảm ơn bạn đã đọc bài viết này.