Tin tức và phân tích của tất cả các thiết bị di động

Bộ dữ liệu Python so với danh sách: điểm tương đồng và khác biệt, giải thích

Trong hướng dẫn này, bạn sẽ tìm hiểu những điểm giống và khác nhau giữa các bộ dữ liệu và danh sách trong Python. Bạn cũng sẽ hiểu khi nào bạn nên sử dụng một tuple.

Danh sách và bộ dữ liệu là cấu trúc dữ liệu tích hợp sẵn trong Python. Chúng có thể được sử dụng để lưu trữ một bộ sưu tập các mặt hàng.

Từ việc hỗ trợ lập chỉ mục và cắt để chứa các kiểu dữ liệu không đồng nhất, các bộ dữ liệu và danh sách dường như có chức năng tương tự nhau. Do đó, hiểu được sự tương đồng và khác biệt giữa chúng có thể giúp bạn quyết định nên sử dụng cấu trúc dữ liệu nào.

Hãy bắt đầu.

👩🏽‍💻 Bạn có thể chạy Python REPL và làm theo hướng dẫn này. Bạn cũng có thể sử dụng trình soạn thảo web Python newsblog.pl để viết mã.

Python Tuple vs List: Điểm giống nhau là gì?

Hãy bắt đầu bằng cách tìm hiểu về sự giống nhau giữa danh sách và bộ dữ liệu. Để giúp bạn học tốt hơn, chúng tôi cung cấp các ví dụ về cả danh sách và bộ.

#1. Có thể lặp lại trong Python

Trong Python, danh sách được đặt trong dấu ngoặc vuông trong khi bộ dữ liệu được đặt trong dấu ngoặc đơn. Bạn cũng có thể tạo một tuple dưới dạng tập hợp các giá trị được phân tách bằng dấu phẩy – không có dấu ngoặc đơn.

Cả hai đều có thể lặp lại; để bạn có thể lặp qua chúng bằng vòng lặp for.

Ô mã sau đây cho biết cách lặp qua danh sách.

nums = [2,6,7,10]
print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'list'>
2
6
7
10

Như được giải thích bên dưới, bạn cũng có thể lặp qua một bộ bằng vòng lặp

nums = (2,6,7,10)

# Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check!

print(f"Type of nums is {type(nums)}")
for num in nums:
  print(num)

# Output
Type of nums is <class 'tuple'>
2
6
7
10

#2. Hỗ trợ tạo từ các trình tự khác

Một điểm tương đồng khác giữa danh sách và bộ dữ liệu là chúng có thể được tạo từ các chuỗi hiện có, chẳng hạn như chuỗi.

sample_str = "Coding!"

Ô mã bên dưới cho biết cách list(string) trả về một danh sách có các mục trong danh sách là các ký tự trong chuỗi.

list_from_str = list(sample_str)
print(list_from_str)

# Output
['C', 'o', 'd', 'i', 'n', 'g', '!']

Tương tự, một bộ có thể được tạo từ một chuỗi hoặc chuỗi khác bằng cách sử dụng bộ (dãy). Ô mã bên dưới cho biết cách bạn có thể thực hiện việc này.

tuple_from_str = tuple(sample_str)
print(tuple_from_str)

# Output
('C', 'o', 'd', 'i', 'n', 'g', '!')

#3. Hỗ trợ lập chỉ mục và cắt lát

Python hỗ trợ lập chỉ mục null trong đó mục đầu tiên có chỉ mục bằng 0, mục thứ hai có chỉ mục một, v.v. Python cũng hỗ trợ lập chỉ mục phủ định trong đó mục cuối cùng nằm dưới chỉ mục1phần tử áp chót nằm dưới chỉ mục -2 và như thế.

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[1])
# o

Mục có chỉ số -2 là phần tử áp chót, “g”.

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[-2])
# g

Bạn có thể sử dụng cắt lát nếu bạn muốn làm việc với một phần nhỏ của danh sách hoặc bộ. danh sách[start:end] trả về một lát của danh sách bắt đầu từ đầu chỉ mục và kéo dài đến cuối 1. Giá trị gốc mặc định là 0và end là phần tử cuối cùng trong iterable.

Bạn có thể cắt các bộ dữ liệu bằng cùng một cú pháp. Hãy tạo các lát của danh sách và bộ mà chúng ta đã tạo trước đó.

list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!']
print(list_from_str[0:5])

['C', 'o', 'd', 'i', 'n']

Ngoài giá trị bắt đầu và kết thúc, bạn cũng có thể chỉ định giá trị bước. tuple(start:end:step) trả về một phần của tuple từ đầu đến cuối – 1trong các bước.

tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!')
print(tuple_from_str[::2])

('C', 'd', 'n', '!')

Ở đây chúng tôi đặt giá trị bước thành 2. Vì vậy, một lát chứa mọi phần tử khác.

#4. Tập hợp nhiều loại dữ liệu

Trong các ví dụ mà chúng ta đã xem xét, tất cả các phần tử trong danh sách và bộ dữ liệu đều có cùng kiểu dữ liệu.

Tuy nhiên, bạn có thể lưu trữ giá trị của các loại dữ liệu khác nhau bên trong một danh sách hoặc bộ dữ liệu.

Đoạn mã bên dưới student_list chứa tên của học sinh dưới dạng chuỗi, tuổi dưới dạng số nguyên và các ký tự được bảo vệ dưới dạng số thực.

student_list = ["John",22,96.5]
for item in student_list:
  print(f"{item} is of type {type(item)}")

# Output
John is of type <class 'str'>
22 is of type <class 'int'>
96.5 is of type <class 'float'>

Chúng ta có thể đưa ra một ví dụ tương tự cho một tuple.

student_tuple = ("Jane",23,99.5)
for item in student_tuple:
  print(f"{item} is of type {type(item)}")

# Output
Jane is of type <class 'str'>
23 is of type <class 'int'>
99.5 is of type <class 'float'>

#5. Hỗ trợ kiểm tra tư cách thành viên

Cả danh sách và bộ dữ liệu đều cho phép bạn thực hiện kiểm tra tư cách thành viên về sự hiện diện của các phần tử nhất định. Nếu bạn muốn kiểm tra xem một mục nào đó có trong danh sách hoặc bộ dữ liệu hay không, bạn có thể sử dụng toán tử in.

Phần tử của biểu thức trong iterable đánh giá là True nếu iterable chứa một phần tử; nếu không, Sai.

"Alex" in student_list
# False

"Jane" in student_tuple
# True

Cho đến giờ, bạn đã thấy sự giống nhau giữa danh sách và bộ dữ liệu trong Python. Tiếp theo, hãy khám phá sự khác biệt chính giữa hai cấu trúc dữ liệu này.

Tuple Python so với danh sách: sự khác biệt là gì?

#1. Liệt kê tính có thể thay đổi và tính không thay đổi của tuple trong Python

Sự khác biệt quan trọng nhất giữa một danh sách và một bộ trong Python là một bộ là bất biến. Điều này có nghĩa là bạn không thể sửa đổi một bộ tại chỗ.

▶️ Đây là một ví dụ.

tuple1 = ("Java","Python","C++")
tuple1[0] = "Rust"

# Output
----> 2 tuple1[0] = "Rust"

TypeError: 'tuple' object does not support item assignment

Danh sách là một cấu trúc dữ liệu có thể thay đổi, vì vậy chúng ta có thể sửa đổi danh sách bằng cách thay đổi phần tử tại một chỉ mục cụ thể, như trong ô mã sau.

list1 = ["Java","Python","C++"]
list1[0] = "Rust"
print(list1)

# Output
['Rust', 'Python', 'C++']

#2. Danh sách có độ dài thay đổi so với bộ có độ dài cố định

Danh sách Python là cấu trúc dữ liệu có độ dài thay đổi.

Bạn có thể làm như sau:

  • Thêm một mục vào cuối danh sách
  • Thêm các mục từ danh sách khác vào cuối danh sách hiện tại
  • Xóa các mục tại một chỉ mục cụ thể khỏi danh sách
list1 = [2,3,4,5]

# add an item to the end
list1.append(9)
print(list1)

# add items from list2 to the end of list1
list2 = [0,7]
list1.extend(list2)
print(list1)

# remove an item from list1
list1.pop(0)
print(list1)

▶️ Đầu ra của đoạn mã trên.

# Output
[2, 3, 4, 5, 9]
[2, 3, 4, 5, 9, 0, 7]
[3, 4, 5, 9, 0, 7]

Tuples là cấu trúc dữ liệu có độ dài cố định. Vì vậy, bạn không thể thêm hoặc xóa các phần tử khỏi bộ dữ liệu hiện có. Nhưng bạn có thể xác định lại bộ dữ liệu để chứa các phần tử khác nhau.

tuple1 = (2,4,6,8)
tuple1 = (1,8,9)
print(tuple1)

# Output
(1, 8, 9)

#3. Kích thước trong bộ nhớ

Bây giờ chúng ta sẽ xây dựng dựa trên những gì chúng ta đã học trong phần trước: danh sách là một cấu trúc dữ liệu có độ dài thay đổi.

Khi một danh sách được xác định ban đầu, nó được phân bổ một kích thước cụ thể trong bộ nhớ. Bây giờ, khi bạn sửa đổi danh sách bằng các phương thức append() hoặc expand(), bạn phải phân bổ thêm bộ nhớ để chứa các mục đã thêm. Việc phân bổ này hầu như luôn được thực hiện nhiều hơn số lượng mặt hàng được thêm vào.

Vì vậy, cần phải theo dõi số lượng mục trong danh sách và không gian được phân bổ. Ngoài ra, vì danh sách có độ dài thay đổi nên có một con trỏ để trỏ tới địa chỉ của các mục trong danh sách. Kết quả là, các danh sách có độ dài k chiếm nhiều bộ nhớ hơn một bộ có cùng k phần tử.

Đây là một minh họa đơn giản.

Bạn có thể sử dụng phương thức getsizeof() tích hợp sẵn của mô-đun tích hợp sys trên đối tượng python để lấy kích thước của đối tượng trong bộ nhớ.

import sys

list1 = [4,5,9,14]
list_size = sys.getsizeof(list1)
print(f"Size of list:{list_size}")

tuple1 = (4,5,9,14)
tuple_size = sys.getsizeof(tuple1)
print(f"Size of tuple:{tuple_size}")

Một danh sách chiếm nhiều bộ nhớ hơn một bộ cho cùng số lượng và giá trị của các phần tử, như được xác minh trong kết quả bên dưới.

# Output
Size of list:104
Size of tuple:88

Khi nào bạn nên sử dụng bộ dữ liệu Python?

Từ sự khác biệt và tương đồng giữa danh sách Python và bộ dữ liệu, bạn biết rằng nếu bạn cần một bộ sưu tập có thể thay đổi, bạn nên sử dụng một danh sách.

Nhưng khi nào bạn nên sử dụng tuple để thay thế?

Chúng ta sẽ thảo luận về nó trong phần này.

#1. Bộ sưu tập chỉ đọc

Bất cứ khi nào bạn muốn một bộ sưu tập là bất biến, bạn nên định nghĩa nó là một bộ. Giả sử color = (243,55,103) một bộ chứa các giá trị RGB tương ứng với bóng màu. Xác định một màu như một bộ dữ liệu đảm bảo rằng nó không thể bị sửa đổi.

Về cơ bản, khi bạn cần một bộ sưu tập được dự định là chỉ đọc: các giá trị không được sửa đổi trong chương trình, bạn nên cân nhắc sử dụng một bộ. Điều này sẽ ngăn việc sửa đổi giá trị ngoài ý muốn.

#2. phím từ điển

Ví dụ: bạn tạo một từ điển bằng cách sử dụng các mục key_list làm khóa. Bạn có thể sử dụng phương thức dict.fromkeys() để tạo từ điển từ danh sách.

key_list = list("ABCD")
dict.fromkeys(key_list)

{'A': None, 'B': None, 'C': None, 'D': None}

Giả sử bạn sửa đổi danh sách để chứa “D” là phần tử đầu tiên (chỉ mục 0) – trước khi tạo từ điển.

Điều gì xảy ra với khóa từ điển “A”?

Nếu bạn cố gắng tạo từ điển từ key_list và truy cập giá trị tương ứng với khóa ‘A’, bạn sẽ gặp phải Lỗi Key.

key_list[0] = 'D'

dict.fromkeys(key_list)['A']

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-31-c90392acc2cf> in <module>()
----> 1 dict.fromkeys(key_list)['A']

KeyError: 'A'

Khóa từ điển phải là duy nhất. Vì vậy, bạn không thể có chữ ‘D’ thứ hai làm khóa.

dict.fromkeys(key_list)
{'B': None, 'C': None, 'D': None} # A is no longer a key.

Thay vào đó, nếu bạn sử dụng một bộ, thì việc sửa đổi như vậy là không thể và ít có khả năng xảy ra lỗi hơn. Vì vậy, bạn nên tạo một từ điển bằng cách sử dụng các phần tử tuple làm khóa.

key_tuple = tuple("ABCD")
dict.fromkeys(key_tuple)
{'A': None, 'B': None, 'C': None, 'D': None}

key_tuple[0] = 'D'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-2cecbefa7db2> in <module>()
----> 1 key_tuple[0] = 'D'

TypeError: 'tuple' object does not support item assignment

#3. đối số chức năng

Tính bất biến của các bộ dữ liệu cũng làm cho chúng phù hợp để được truyền dưới dạng các đối số của hàm.

Hãy xem xét hàm find_volume() sau đây, hàm này trả về thể tích của một hình lăng trụ hình chữ nhật với các kích thước đã cho: chiều dài, chiều rộng và chiều cao.

def find_volume(dimensions):
  l,b,h = dimensions
  return l*b*h

Giả sử những thứ nguyên này có sẵn trong một danh sách gọi là thứ nguyên. Gọi find_volume() với kích thước làm đối số sẽ trả về âm lượng.

dimensions = [2,8,5]
find_volume(dimensions)
80

Bạn luôn có thể thay đổi kích thước được lưu trong danh sách.

dimensions = [20,8,5]
find_volume(dimensions)
800

Tuy nhiên, đôi khi bạn sẽ cần các giá trị không đổi và không bị sửa đổi. Đây là lúc bạn nên xem xét việc lưu trữ các đối số dưới dạng các bộ dữ liệu và sử dụng chúng trong một lệnh gọi hàm.

#4. Trả về giá trị từ hàm

Trong Python, bạn sẽ bắt gặp các bộ giá trị trả về của hàm. Khi bạn trả về nhiều giá trị từ một hàm, Python sẽ ngầm trả về chúng dưới dạng một tuple.

Xét hàm return_even() sau:

def return_even(num):
  even = [i for i in range(num) if (i%2==0)]
  return even,len(even)
  • Nó lấy một số làm đối số
  • Trả về một danh sách các số chẵn trong một khoảng thời gian [0,num) and the length of that list.

Let’s set the value of num 20 and call the function.

num = 20

Calling return_even() returns the two values in a tuple. You can call the type() function with the function call as the verification argument.

type(return_even(num)) # <class 'tuple'>

You can print out the return value to verify that it’s a tuple containing the list of even numbers as the first item and the length of the list as the second item.

print(return_even(num))
([0, 2, 4, 6, 8, 10, 12, 14, 16, 18]10)

Vì có hai phần tử trong bộ dữ liệu, bạn có thể tách nó thành hai biến như hình bên dưới.

even_nums, count = return_even(num)

print(even_nums)
print(count)

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
10

Đăng kí

Tôi hy vọng hướng dẫn này cung cấp một bộ dữ liệu python toàn diện so với danh sách.

Hãy kết thúc hướng dẫn với một bản tóm tắt ngắn:

  • Danh sách và bộ dữ liệu là cấu trúc dữ liệu tích hợp sẵn trong Python.
  • Điểm tương đồng: có thể lặp lại, hỗ trợ lập chỉ mục, cắt, các loại dữ liệu khác nhau và toán tử để kiểm tra tư cách thành viên.
  • Sự khác biệt chính: Danh sách có thể thay đổi trong khi bộ dữ liệu là bất biến.
  • Các điểm khác biệt khác: Các bộ dữ liệu có độ dài cố định và danh sách có độ dài thay đổi, kích thước bộ dữ liệu nhỏ hơn trong bộ nhớ.
  • Khi nào nên sử dụng tuple? Đối với các bộ sưu tập bất biến, khóa từ điển và đối số hàm.

Sau đó, hãy xem các dự án Python để thực hành và học hỏi. Hoặc tìm hiểu các phương pháp để loại bỏ các mục trùng lặp khỏi danh sách python. Chúc bạn học tập vui vẻ! thì hãy viết mã vui vẻ!👩🏽‍💻