Trong Python, khi nào nên sử dụng Từ điển, Danh sách hoặc Bộ?


Câu trả lời:


603

Một listgiữ trật tự, dictsetkhô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 ;-).

dictliên kết với mỗi khóa một giá trị, trong khi listsetchỉ chứa các giá trị: các trường hợp sử dụng rất khác nhau, rõ ràng.

setyêu cầu các mục phải có khả năng băm, listkhông: nếu bạn có các mục không thể băm, do đó, bạn không thể sử dụng setvà thay vào đó phải sử dụng list.

setcấm trùng lặp, listkhô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, settốt hơn là list.


6
Lưu ý rằng Python 3.7 đã ra lệnh theo mặc định
Gigi Bayte 2

172
  • Bạn chỉ cần một chuỗi các mặt hàng theo thứ tự? Đi cho một danh sách.
  • Bạn chỉ cần biết liệu bạn đã một giá trị cụ thể hay chưa, nhưng không cần đặt hàng (và bạn không cần lưu trữ các bản sao)? Sử dụng một bộ.
  • Bạn có cần liên kết các giá trị với các khóa để bạn có thể tra cứu chúng một cách hiệu quả (theo khóa) sau này không? Sử dụng một từ điển.

30
Đây phải là phần "TL; DR" cho câu trả lời trên của Alex M .:-)
Alex Boschmans 23/2/2015

9
Tôi nghĩ đó là cách khác .. Alex nên quyên góp phiếu bầu của mình cho Jon. Câu trả lời này bao gồm khá nhiều thứ và nó ngắn gọn và rõ ràng hơn nhiều.
mehmet

tuy nhiên, nếu bạn muốn biết sự khác biệt về độ phức tạp thời gian giữa các loại dữ liệu này thì lời giải thích của Alex hoạt động tốt hơn
kcEmenike

19

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).


Uh, anh ấy đã không hỏi về tuples.
thói quen

18
  • Sử dụng một từ điển khi bạn có một bộ các khóa duy nhất ánh xạ tới các giá trị.

  • Sử dụng một danh sách nếu bạn có một bộ sưu tập các mặt hàng.

  • Sử dụng một bộ để lưu trữ một bộ các mặt hàng không có thứ tự.


6

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.

Giải thích chi tiết

Danh sách

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 lx 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 xtrong l(tại hoặc sau ivà trước jindeces)

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 icủa lđược thay thế bởix
  • l[i:j] = t- lát ltừ 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ách
  • l.append(x)- nối xvào cuối chuỗi
  • l.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 lvới nội dung củat
  • l *= n- cập nhật lvới nội dung của nó lặp đi lặp lại nlần
  • l.insert(i, x)- chèn xvào ltại chỉ mục được đưa ra bởii
  • l.pop([i])- lấy vật phẩm tại ivà cũng loại bỏ nó khỏil
  • l.remove(x)- xóa mục đầu tiên khỏi lvị trí l[i]bằng x
  • l.reverse()- đảo ngược các mục ltạ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 appendpop.

Từ điển

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.

Bộ

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.


5

Mặc dù điều này không bao gồm sets, nhưng đó là một lời giải thích tốt về dicts và lists:

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.

http://www.sthurlow.com/python/lesson06/


4

Đố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.

  • OrderedDictdequecó sẵn thông qua collectionsmô-đun.
  • heapqcó sẵn từ các heapqmô-đun
  • LifoQueue, QueuePriorityQueuecó sẵn thông qua queuemô-đun được thiết kế để truy cập đồng thời (luồng). (Ngoài ra còn multiprocessing.Queuecó sẵn nhưng tôi không biết sự khác biệt queue.Queuenhư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. sơ đồ

PS: sơ đồ đã được thực hiện với yed. Tệp graphml ở đây


3

Kết hợp với danh sách , dictsbộ , 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.


1

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.


1

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'}}

1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.