Giải nén (mở rộng và gán cho nhiều biến) bộ dữ liệu và danh sách trong Python

Kinh doanh

Trong Python, các phần tử của một bộ hoặc danh sách có thể được mở rộng và gán cho nhiều biến. Điều này được gọi là giải nén trình tự hoặc phân công giải nén.

Các chi tiết sau đây được mô tả ở đây.

  • Giải nén các kiến ​​thức cơ bản về bộ giá trị và danh sách
  • Bộ giá lồng nhau, danh sách giải nén
  • Mở gói bằng Dấu gạch dưới:_
  • Mở hộp có dấu hoa thị:*

Xem bài viết sau để biết thông tin về cách sử dụng dấu hoa thị để mở rộng và chuyển các bộ giá trị, danh sách và từ điển làm đối số hàm.

Giải nén các kiến ​​thức cơ bản về bộ giá trị và danh sách

Khi các biến được viết ở phía bên trái, được phân tách bằng dấu phẩy, mỗi biến được gán một phần tử của bộ hoặc danh sách ở phía bên phải. Nó giống nhau đối với cả bộ giá trị và danh sách (các ví dụ sau đây được viết ở dạng bộ mã số).

t = (0, 1, 2)

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# 2

l = [0, 1, 2]

a, b, c = l

print(a)
print(b)
print(c)
# 0
# 1
# 2

Lưu ý rằng vì bộ giá trị có thể bỏ qua dấu ngoặc tròn, điều này có thể được sử dụng để gán nhiều giá trị cho nhiều biến trên một dòng như sau.

a, b = 0, 1

print(a)
print(b)
# 0
# 1

Nếu số lượng biến không khớp với số phần tử, thì sẽ xảy ra lỗi.

# a, b = t
# ValueError: too many values to unpack (expected 2)

# a, b, c, d = t
# ValueError: not enough values to unpack (expected 4, got 3)

Nếu số lượng biến ít hơn số phần tử, các phần tử còn lại có thể được gán dưới dạng danh sách bằng cách thêm dấu sao vào tên biến (xem bên dưới).

Bộ giá lồng nhau, danh sách giải nén

Các bộ giá trị và danh sách lồng nhau cũng có thể được giải nén. Nếu bạn cũng muốn giải nén nội dung, hãy đặt biến vào một trong các phần sau

  • ()
  • []
t = (0, 1, (2, 3, 4))

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)

print(type(c))
# <class 'tuple'>

a, b, (c, d, e) = t

print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4

Được giải nén bằng _underscore_.

Trong Python, không chỉ được giải nén, các giá trị không cần thiết được gán theo quy ước cho dấu gạch dưới (underscore) _. Không có ý nghĩa ngữ pháp đặc biệt; chúng chỉ đơn giản được gán cho một biến có tên _.

t = (0, 1, 2)

a, b, _ = t

print(a)
print(b)
print(_)
# 0
# 1
# 2

Mở hộp có dấu hoa thị

Nếu số lượng biến ít hơn số phần tử, dấu hoa thị trong tên biến sẽ làm cho các phần tử được gán cùng nhau dưới dạng danh sách.

Cú pháp này đã được triển khai từ Python 3 và không có sẵn trong Python 2.

Các phần tử được gán từ đầu và cuối cho các biến không có dấu hoa thị, và các phần tử còn lại được gán dưới dạng danh sách cho các biến có dấu hoa thị.

t = (0, 1, 2, 3, 4)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]

print(type(c))
# <class 'list'>

a, *b, c = t

print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4

*a, b, c = t

print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4

Ví dụ: nếu bạn chỉ muốn gán hai phần tử đầu tiên của một bộ hoặc danh sách cho một biến, bạn có thể sử dụng dấu gạch dưới ở trên cho những phần không cần thiết.

a, b, *_ = t

print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]

Tương tự cũng có thể được viết như sau

a, b = t[0], t[1]

print(a)
print(b)
# 0
# 1

Chỉ có thể đính kèm một dấu hoa thị. Nếu có nhiều biến được đánh dấu bằng dấu hoa thị, sẽ xảy ra lỗi SyntaxError vì không thể xác định có bao nhiêu phần tử được gán cho mỗi biến.

# *a, b, *c = t
# SyntaxError: two starred expressions in assignment

Lưu ý rằng ngay cả một phần tử được gán cho một biến được đánh dấu bằng dấu hoa thị cũng được gán dưới dạng danh sách.

t = (0, 1, 2)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2]

print(type(c))
# <class 'list'>

Nếu không có phần tử bổ sung, một danh sách trống sẽ được gán.

a, b, c, *d = t

print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []