Khi nào tôi nên sử dụng từ điển, danh sách hoặc bộ?
Có kịch bản nào phù hợp hơn cho từng loại dữ liệu không?
Khi nào tôi nên sử dụng từ điển, danh sách hoặc bộ?
Có kịch bản nào phù hợp hơn cho từng loại dữ liệu không?
Câu trả lời:
Một list
giữ trật tự, dict
và set
không: khi bạn quan tâm đến trật tự, do đó, bạn phải sử dụng list
(nếu lựa chọn của bạn của container được giới hạn đến ba, tất nhiên ;-).
dict
liên kết với mỗi khóa một giá trị, trong khi list
và set
chỉ chứa các giá trị: các trường hợp sử dụng rất khác nhau, rõ ràng.
set
yêu cầu các mục phải có khả năng băm, list
không: nếu bạn có các mục không thể băm, do đó, bạn không thể sử dụng set
và thay vào đó phải sử dụng list
.
set
cấm trùng lặp, list
không: cũng là một sự khác biệt quan trọng. (Một "multiset", ánh xạ trùng lặp thành một số khác nhau cho các mặt hàng xuất hiện nhiều lần, có thể được tìm thấy collections.Counter
- bạn có thể xây dựng một cái như một dict
, nếu vì một lý do kỳ lạ nào đó bạn không thể nhập collections
, hoặc, trước 2.7 Python là một collections.defaultdict(int)
, sử dụng các mục làm khóa và giá trị liên quan làm số đếm).
Việc kiểm tra tư cách thành viên của một giá trị trong một set
(hoặc dict
, cho các khóa) rất nhanh (mất khoảng thời gian ngắn, không đổi), trong khi trong một danh sách cần có thời gian tỷ lệ thuận với độ dài của danh sách trong các trường hợp trung bình và tồi tệ nhất. Vì vậy, nếu bạn có các mặt hàng có thể băm, đừng quan tâm đến cách đặt hàng hoặc trùng lặp và muốn kiểm tra tư cách thành viên nhanh chóng, set
tốt hơn là list
.
Khi bạn muốn một bộ sưu tập các yếu tố độc đáo, hãy sử dụng a set
. (Ví dụ: khi bạn muốn tập hợp tất cả các từ được sử dụng trong tài liệu).
Khi bạn muốn thu thập một danh sách các yếu tố theo thứ tự bất biến, hãy sử dụng a tuple
. (Ví dụ: khi bạn muốn một cặp (tên, phone_number) mà bạn muốn sử dụng làm thành phần trong tập hợp, bạn sẽ cần một bộ dữ liệu thay vì danh sách vì các bộ yêu cầu các phần tử là bất biến).
Khi bạn muốn thu thập một danh sách các yếu tố có thể thay đổi, hãy sử dụng a list
. (Ví dụ: khi bạn muốn nối các số điện thoại mới vào danh sách: [number1, number2, ...]).
Khi bạn muốn ánh xạ từ khóa sang giá trị, hãy sử dụng a dict
. (Ví dụ: khi bạn muốn có một danh bạ điện thoại sẽ ánh xạ tên thành số điện thoại {'John Smith' : '555-1212'}
:). Lưu ý các phím trong một dict là không có thứ tự. (Nếu bạn lặp qua một lệnh (danh bạ điện thoại), các phím (tên) có thể hiển thị theo bất kỳ thứ tự nào).
Tóm lại, sử dụng:
list
- nếu bạn yêu cầu một chuỗi các mục.
dict
- nếu bạn yêu cầu liên kết các giá trị với các khóa
set
- nếu bạn yêu cầu giữ các yếu tố độc đáo.
Danh sách là một chuỗi có thể thay đổi, thường được sử dụng để lưu trữ các bộ sưu tập các mặt hàng đồng nhất.
Một danh sách thực hiện tất cả các hoạt động trình tự phổ biến:
x in l
và x not in l
l[i]
, l[i:j]
,l[i:j:k]
len(l)
, min(l)
,max(l)
l.count(x)
l.index(x[, i[, j]])
- Chỉ số về sự xuất hiện của 1 x
trong l
(tại hoặc sau i
và trước j
indeces)Một danh sách cũng thực hiện tất cả các hoạt động trình tự có thể thay đổi:
l[i] = x
- mục i
của l
được thay thế bởix
l[i:j] = t
- lát l
từ i
đến j
được thay thế bằng nội dung của lần lặpt
del l[i:j]
- giống như l[i:j] = []
l[i:j:k] = t
- các yếu tố của l[i:j:k]
được thay thế bởit
del l[i:j:k]
- loại bỏ các yếu tố của s[i:j:k]
danh sáchl.append(x)
- nối x
vào cuối chuỗil.clear()
- xóa tất cả các mục khỏi l
(giống như del l[:]
)l.copy()
- tạo một bản sao nông của l
(giống như l[:]
)l.extend(t)
hoặc l += t
- mở rộng l
với nội dung củat
l *= n
- cập nhật l
với nội dung của nó lặp đi lặp lại n
lầnl.insert(i, x)
- chèn x
vào l
tại chỉ mục được đưa ra bởii
l.pop([i])
- lấy vật phẩm tại i
và cũng loại bỏ nó khỏil
l.remove(x)
- xóa mục đầu tiên khỏi l
vị trí l[i]
bằng xl.reverse()
- đảo ngược các mục l
tại chỗMột danh sách có thể được sử dụng như ngăn xếp bằng cách tận dụng các phương thức append
và pop
.
Một từ điển ánh xạ các giá trị có thể băm đến các đối tượng tùy ý. Một từ điển là một đối tượng có thể thay đổi. Các hoạt động chính trên một từ điển đang lưu trữ một giá trị với một số khóa và trích xuất giá trị được cung cấp cho khóa.
Trong từ điển, bạn không thể sử dụng làm giá trị khóa không thể băm, nghĩa là các giá trị có chứa danh sách, từ điển hoặc các loại có thể thay đổi khác.
Một tập hợp là một bộ sưu tập các đối tượng có thể băm riêng biệt. Một tập hợp thường được sử dụng để bao gồm kiểm tra thành viên, loại bỏ các bản sao khỏi chuỗi và tính toán các hoạt động toán học như giao điểm, liên kết, khác biệt và khác biệt đối xứng.
Mặc dù điều này không bao gồm set
s, nhưng đó là một lời giải thích tốt về dict
s và list
s:
Danh sách là những gì họ dường như - một danh sách các giá trị. Mỗi một trong số chúng được đánh số, bắt đầu từ số 0 - số thứ nhất được đánh số 0, số thứ hai 1, số thứ hai, v.v. Bạn có thể xóa các giá trị khỏi danh sách và thêm giá trị mới vào cuối. Ví dụ: Tên nhiều con mèo của bạn.
Từ điển tương tự như những gì tên của chúng gợi ý - một từ điển. Trong từ điển, bạn có một 'chỉ mục' các từ và cho mỗi từ đó một định nghĩa. Trong python, từ này được gọi là 'khóa' và định nghĩa là 'giá trị'. Các giá trị trong từ điển không được đánh số - tương tự như tên mà chúng gợi ý - một từ điển. Trong từ điển, bạn có một 'chỉ mục' các từ và cho mỗi từ đó một định nghĩa. Các giá trị trong từ điển không được đánh số - chúng cũng không theo bất kỳ thứ tự cụ thể nào - khóa cũng làm điều tương tự. Bạn có thể thêm, xóa và sửa đổi các giá trị trong từ điển. Ví dụ: danh bạ điện thoại.
Đối với C ++, tôi luôn luôn có biểu đồ luồng này trong đầu: Trong trường hợp nào tôi sử dụng một bộ chứa STL cụ thể? , vì vậy tôi đã tò mò nếu một cái gì đó tương tự cũng có sẵn cho Python3, nhưng tôi không gặp may.
Điều bạn cần lưu ý đối với Python là: Không có một tiêu chuẩn Python nào như đối với C ++. Do đó, có thể có sự khác biệt lớn đối với các trình thông dịch Python khác nhau (ví dụ CPython, PyPy). Biểu đồ luồng sau đây dành cho CPython.
Ngoài ra tôi thấy không có cách nào tốt để kết hợp các cấu trúc dữ liệu sau vào sơ đồ: bytes
, byte arrays
, tuples
, named_tuples
, ChainMap
, Counter
, và arrays
.
OrderedDict
và deque
có sẵn thông qua collections
mô-đun.heapq
có sẵn từ các heapq
mô-đunLifoQueue
, Queue
và PriorityQueue
có sẵn thông qua queue
mô-đun được thiết kế để truy cập đồng thời (luồng). (Ngoài ra còn multiprocessing.Queue
có sẵn nhưng tôi không biết sự khác biệt queue.Queue
nhưng sẽ cho rằng nó nên được sử dụng khi cần truy cập đồng thời từ các quy trình.)dict
, set
, frozen_set
, Và list
được xây dựng trong tất nhiênĐối với bất cứ ai tôi sẽ biết ơn nếu bạn có thể cải thiện câu trả lời này và cung cấp một sơ đồ tốt hơn trong mọi khía cạnh. Hãy thoải mái và chào đón.
PS: sơ đồ đã được thực hiện với yed. Tệp graphml ở đây
Kết hợp với danh sách , dicts và bộ , cũng có một đối tượng python thú vị khác, OrderedDicts .
Từ điển được đặt hàng giống như từ điển thông thường nhưng họ nhớ thứ tự các mục được chèn vào. Khi lặp lại từ điển đã đặt hàng, các mục được trả về theo thứ tự các khóa của chúng được thêm lần đầu tiên.
OrderedDicts có thể hữu ích khi bạn cần giữ nguyên thứ tự của các khóa, ví dụ như làm việc với các tài liệu: Thông thường cần biểu diễn vectơ của tất cả các thuật ngữ trong tài liệu. Vì vậy, bằng cách sử dụng OrderedDicts, bạn có thể xác minh một cách hiệu quả nếu một thuật ngữ đã được đọc trước đó, thêm các thuật ngữ, trích xuất các thuật ngữ và sau tất cả các thao tác bạn có thể trích xuất biểu diễn vectơ theo thứ tự của chúng.
Danh sách là những gì họ dường như - một danh sách các giá trị. Mỗi một trong số chúng được đánh số, bắt đầu từ số 0 - số thứ nhất được đánh số 0, số thứ hai 1, số thứ hai, v.v. Bạn có thể xóa các giá trị khỏi danh sách và thêm giá trị mới vào cuối. Ví dụ: Tên nhiều con mèo của bạn.
Bộ dữ liệu giống như danh sách, nhưng bạn không thể thay đổi giá trị của chúng. Các giá trị mà bạn đưa ra đầu tiên, là các giá trị mà bạn bị mắc kẹt trong phần còn lại của chương trình. Một lần nữa, mỗi giá trị được đánh số bắt đầu từ 0, để dễ dàng tham khảo. Ví dụ: tên của các tháng trong năm.
Từ điển tương tự như những gì tên của chúng gợi ý - một từ điển. Trong từ điển, bạn có một 'chỉ mục' các từ và cho mỗi từ đó một định nghĩa. Trong python, từ này được gọi là 'khóa' và định nghĩa là 'giá trị'. Các giá trị trong từ điển không được đánh số - tương tự như tên mà chúng gợi ý - một từ điển. Trong từ điển, bạn có một 'chỉ mục' các từ và cho mỗi từ đó một định nghĩa. Trong python, từ này được gọi là 'khóa' và định nghĩa là 'giá trị'. Các giá trị trong từ điển không được đánh số - chúng cũng không theo bất kỳ thứ tự cụ thể nào - khóa cũng làm điều tương tự. Bạn có thể thêm, xóa và sửa đổi các giá trị trong từ điển. Ví dụ: danh bạ điện thoại.
Khi sử dụng chúng, tôi tạo ra một phương pháp toàn diện cho các phương pháp của họ để bạn tham khảo:
class ContainerMethods:
def __init__(self):
self.list_methods_11 = {
'Add':{'append','extend','insert'},
'Subtract':{'pop','remove'},
'Sort':{'reverse', 'sort'},
'Search':{'count', 'index'},
'Entire':{'clear','copy'},
}
self.tuple_methods_2 = {'Search':'count','index'}
self.dict_methods_11 = {
'Views':{'keys', 'values', 'items'},
'Add':{'update'},
'Subtract':{'pop', 'popitem',},
'Extract':{'get','setdefault',},
'Entire':{ 'clear', 'copy','fromkeys'},
}
self.set_methods_17 ={
'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
'Subtract':{'pop', 'remove','discard'},
'Relation':{'isdisjoint', 'issubset', 'issuperset'},
'operation':{'union' 'intersection','difference', 'symmetric_difference'}
'Entire':{'clear', 'copy'}}
Từ điển: Từ điển python được sử dụng như bảng băm với khóa là chỉ mục và đối tượng là giá trị.
Danh sách: Một danh sách được sử dụng để giữ các đối tượng trong một mảng được lập chỉ mục theo vị trí của đối tượng đó trong mảng.
Tập hợp: Tập hợp là một tập hợp với các hàm có thể cho biết một đối tượng có mặt hay không có trong tập hợp.