Tôi có chức năng nhỏ tiện dụng này:
def just[n, seq]:
it = iter[seq]
for _ in range[n - 1]:
yield next[it, None]
yield tuple[it]
Ví dụ:
a, b, c = just[3, range[5]]
print a, b, c
## 0 1 [2, 3, 4]
Cũng hoạt động với ít đối số hơn:
a, b, c = just[3, ['X', 'Y']]
print a, b, c
## X Y []
Đáp lại nhận xét, bạn cũng có thể xác định:
def take2[a, *rest]: return a, rest
def take3[a, b, *rest]: return a, b, rest
def take4[a, b, c, *rest]: return a, b, rest
... etc
và sử dụng nó như thế này:
p = [1,2,3]
a, b = take2[*p]
print a, b
## 1 [2, 3]
Nếu bạn biết có bao nhiêu mục mà chuỗi [danh sách, tuple, set,] có chứa, bạn có thể xem bài viết khác của tôi về việc giải nén các chuỗi có thể đếm được.list, tuple, set…] contains, you can check out my other article on unpacking countable sequences.
Vấn đề
Bạn muốn giải nén một chuỗi [danh sách, tuple, đặt ra] thành các biến riêng biệt nhưng bạn không biết độ dài của chuỗi. Bây giờ nếu bạn thử giải nén trình tự thành các biến, nó dài hơn số lượng biến, Python đã ném một lỗi quá nhiều giá trị để giải nén.list, tuple, set…] into separate variables but you don’t know the length of the sequence. Now if you try unpacking the sequence into variables it is longer than the number of variables, python throws an error “too many values to unpack”.
Dung dịch
Python Hồi Star Biểu thức của ngôi sao *
Can được sử dụng để giải quyết vấn đề này. Hãy tưởng tượng bạn có một hồ sơ chứa, một tên, tuổi và một hoặc nhiều địa chỉ email. Vì bạn không biết có bao nhiêu email mà bản ghi có thể có, bạn có thể sử dụng các biểu thức Python Star như thế này:
Lưu ý nhanh: Bất cứ nơi nào bạn thấy
...
, nó có nghĩa là danh sách tiếp tục.: anywhere you see...
, it means the list goes on.
In [1]: record = ['John Doe', 50, '', ''...]In [2]: name, age, *emails = recordIn [3]: print[name]
John DoeIn [4]: print[age]
50In [5]: print[emails]
['', ''...]
Xem xét một ví dụ khác. Bạn có một danh sách các tên và bạn không biết có bao nhiêu tên có thể nằm trong danh sách, nhưng bạn chỉ quan tâm đến hai tên đầu tiên và hai tên cuối cùng, Python Star Expressions lại đến giải cứu!
In [1] names = ['William', 'Jamie', 'Susan', 'Allison', ... 'Michael', 'David', 'Christian']In [2]: first, second, *others, third, fourth = namesIn [3]: print[first, second, third, fourth]
William Jamie David ChristianIn [4]: print[others]
Susan, Allison..., Michael
Điều quan trọng cần lưu ý là biến được sao chép, ví dụ:
a, b, c = just[3, range[5]]
print a, b, c
## 0 1 [2, 3, 4]
0 sẽ luôn là một danh sách ngay cả khi không có mục nào được giải nén khỏi chuỗi. Để minh họa:# you have a list of numbers which could contain four of more numbers
# but you want only the first fourIn [1]: list_a = [221, 445, 35, 62, 532...]# list_a contains more than four numbersIn [2]: first, second, third, fourth, *others = list_aIn [3]: print[others]
[532...]# others contains the items that were extra in list_a
# note that others is a listIn [4]: list_b = [221, 445, 35, 62]# list_b contains only four numbersIn [5]: first, second, third, fourth, *others = list_bIn [3]: print[others]
[]# since no extra number is in list_b, others is empty
# note that others is still a list
Mở rộng không thể giải nén được
Trong bài viết trước của tôi, tôi đã giải thích cách giải nén chuỗi phần tử n trong để tách n biến bằng Python. [tức là bạn được yêu cầu biết chính xác có bao nhiêu phần tử theo thứ tự để giải nén]
Hôm nay, tôi sẽ giải thích phải làm gì khi bạn không biết có bao nhiêu biến để giải nén hoặc bạn chỉ muốn giải nén một số yếu tố khỏi một chuỗi.
Điều này được thực hiện khi đặt toán tử * trước tên biến bắt buộc. Điều xảy ra ở đây là biến với toán tử * lấy tất cả các phần tử còn lại sau khi các biến khác được gán với các phần tử tương ứng của chúng.
Đủ Chit-Chat. Hãy để đi sâu vào một số ví dụ.
Giả sử có một tuple có chứa hồ sơ sinh viên Tom. Nó có tên Tom, email và điểm số của anh ấy.
Tuple này có thể được giải nén như dưới đây.
Như bạn có thể thấy tất cả các lớp được giải nén vào biến ‘lớp, vì chúng tôi đã sử dụng‘**.
Đây là một ví dụ khác:
Danh sách chứa các GPA hiện tại và trước đó được giải nén thành hai biến.Có những lúc bạn cảm thấy như bạn không muốn tất cả các yếu tố này và chỉ cần một số trong số chúng. Vào những thời điểm này, điều dễ dàng nhất và phổ biến nhất là sử dụng một biến số vứt đi với toán tử *. Biến số vứt bỏ phổ biến nhất là ‘_. [Xin lưu ý rằng bạn có thể sử dụng bất kỳ tên biến nào cho mục đích này]
Chỉ các yếu tố cần thiết được giải nénSử dụng * Cú pháp đặc biệt hữu ích nếu bạn có danh sách các bộ dữ liệu với nhiều độ dài khác nhau và muốn giải nén nó.
Ở đây danh sách L có hai bộ dữ liệu có chiều dài 3 và 2 tương ứng. Bằng cách sử dụng * cả hai bộ dữ liệu đã được giải nén.
Bonus!!!
Phương pháp này có thể được kết hợp với các toán tử chuỗi như chia, theo thứ tự để tách và giải nén một chuỗi đồng thời.
Tách và giải nén chuỗi đồng thời.