Bài 4.4. Làm việc với một phần của List

Trong Chương 3, bạn đã học cách truy cập các phần tử đơn lẻ trong một danh sách, và trong chương này, bạn đã học cách làm việc với tất cả các phần tử trong một danh sách. Bạn cũng có thể làm việc với một nhóm mục cụ thể trong một danh sách, được gọi là slice trong Python.

Cắt một phần của danh sách

Để tạo một slice, bạn chỉ định chỉ số của phần tử đầu tiên và cuối cùng mà bạn muốn làm việc. Giống như hàm range(), Python dừng lại một mục trước chỉ số thứ hai mà bạn chỉ định. Để xuất ra ba phần tử đầu tiên trong một danh sách, bạn sẽ yêu cầu các chỉ số từ 0 đến 3, điều này sẽ trả về các phần tử 0, 1 và 2.

Ví dụ sau đây liên quan đến một danh sách các cầu thủ trong một đội:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])

Mã này in ra một phần của danh sách. Đầu ra giữ nguyên cấu trúc của danh sách và bao gồm ba cầu thủ đầu tiên trong danh sách:

['charles', 'martina', 'michael']

Bạn có thể tạo ra bất kỳ tập hợp con nào của một danh sách. Ví dụ, nếu bạn muốn các mục thứ hai, thứ ba và thứ tư trong một danh sách, bạn sẽ bắt đầu slice tại chỉ số 1 và kết thúc tại chỉ số 4:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])

Lần này slice bắt đầu với 'martina' và kết thúc với 'florence':

['martina', 'michael', 'florence']

Nếu bạn bỏ qua chỉ số đầu tiên trong một slice, Python tự động bắt đầu slice của bạn từ đầu danh sách:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])

Không có chỉ số bắt đầu, Python bắt đầu từ đầu danh sách:

['charles', 'martina', 'michael', 'florence']

Một cú pháp tương tự hoạt động nếu bạn muốn một slice bao gồm phần cuối của danh sách. Ví dụ, nếu bạn muốn tất cả các mục từ mục thứ ba đến mục cuối cùng, bạn có thể bắt đầu với chỉ số 2 và bỏ qua chỉ số thứ hai:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[2:])

Python trả về tất cả các mục từ mục thứ ba đến cuối danh sách:

['michael', 'florence', 'eli']

Cú pháp này cho phép bạn xuất ra tất cả các phần tử từ bất kỳ điểm nào trong danh sách của bạn đến cuối, bất kể độ dài của danh sách. Nhớ rằng một chỉ số âm trả về một phần tử ở một khoảng cách nhất định từ cuối danh sách; do đó, bạn có thể xuất ra bất kỳ slice nào từ cuối danh sách. Ví dụ, nếu chúng ta muốn xuất ra ba cầu thủ cuối cùng trong danh sách, chúng ta có thể sử dụng slice players[-3:]:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])

Điều này in ra tên của ba cầu thủ cuối cùng và sẽ tiếp tục hoạt động khi danh sách các cầu thủ thay đổi kích thước.

Lặp qua một phần của danh sách

Bạn có thể sử dụng một slice trong một vòng lặp for nếu bạn muốn lặp qua một tập hợp con của các phần tử trong một danh sách. Trong ví dụ tiếp theo, chúng ta lặp qua ba cầu thủ đầu tiên và in ra tên của họ như một phần của danh sách đơn giản:

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first three players on my team:")
for player in players[:3]:
    print(player.title())

Thay vì lặp qua toàn bộ danh sách các cầu thủ, Python chỉ lặp qua ba tên đầu tiên:

Here are the first three players on my team:
Charles
Martina
Michael

Slices rất hữu ích trong nhiều tình huống. Ví dụ, khi bạn đang tạo một trò chơi, bạn có thể thêm điểm cuối cùng của người chơi vào một danh sách mỗi khi người chơi hoàn thành trò chơi. Bạn có thể sau đó lấy ba điểm cao nhất của người chơi bằng cách sắp xếp danh sách theo thứ tự giảm dần và lấy một slice chỉ bao gồm ba điểm cao nhất. Khi bạn đang làm việc với dữ liệu, bạn có thể sử dụng slices để xử lý dữ liệu của bạn trong các khối có kích thước cụ thể. Hoặc, khi bạn đang xây dựng một ứng dụng web, bạn có thể sử dụng slices để hiển thị thông tin trong một loạt các trang với một lượng thông tin phù hợp trên mỗi trang.

Sao chép một danh sách

Thường thì bạn sẽ muốn bắt đầu với một danh sách hiện có và tạo ra một danh sách hoàn toàn mới dựa trên danh sách đầu tiên. Hãy khám phá cách sao chép một danh sách hoạt động và xem xét một tình huống trong đó sao chép một danh sách là hữu ích.

Để sao chép một danh sách, bạn có thể tạo một slice bao gồm toàn bộ danh sách gốc bằng cách bỏ qua chỉ số đầu tiên và chỉ số thứ hai ([:]). Điều này cho Python biết tạo một slice bắt đầu từ mục đầu tiên và kết thúc với mục cuối cùng, tạo ra một bản sao của toàn bộ danh sách.

Ví dụ, hãy tưởng tượng chúng ta có một danh sách các món ăn yêu thích của mình và muốn tạo một danh sách riêng các món ăn mà một người bạn thích. Người bạn này thích tất cả mọi thứ trong danh sách của chúng ta cho đến nay, vì vậy chúng ta có thể tạo danh sách của họ bằng cách sao chép danh sách của chúng ta:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

Đầu tiên, chúng ta tạo một danh sách các món ăn mà chúng ta thích có tên là my_foods. Sau đó, chúng ta tạo một danh sách mới có tên là friend_foods. Chúng ta tạo một bản sao của my_foods bằng cách yêu cầu một slice của my_foods mà không chỉ định bất kỳ chỉ số nào, và gán bản sao cho friend_foods. Khi chúng ta in ra mỗi danh sách, chúng ta thấy rằng cả hai đều chứa các món ăn giống nhau:

My favorite foods are:
['pizza', 'falafel', 'carrot cake']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake']

Để chứng minh rằng chúng ta thực sự có hai danh sách riêng biệt, chúng ta sẽ thêm một món ăn mới vào mỗi danh sách và cho thấy rằng mỗi danh sách theo dõi các món ăn yêu thích của người tương ứng:

my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

Chúng ta sao chép các mục gốc trong my_foods vào danh sách mới friend_foods, như chúng ta đã làm trong ví dụ trước. Tiếp theo, chúng ta thêm một món ăn mới vào mỗi danh sách: chúng ta thêm 'cannoli' vào my_foods, và chúng ta thêm 'ice cream' vào friend_foods. Sau đó, chúng ta in ra hai danh sách để xem liệu mỗi món ăn này có nằm trong danh sách phù hợp không:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'ice cream']

Đầu ra cho thấy rằng 'cannoli' bây giờ xuất hiện trong danh sách các món ăn yêu thích của chúng ta nhưng 'ice cream' thì không. Chúng ta có thể thấy rằng 'ice cream' bây giờ xuất hiện trong danh sách của bạn của chúng ta nhưng 'cannoli' thì không. Nếu chúng ta chỉ đơn giản đặt friend_foods bằng my_foods, chúng ta sẽ không tạo ra hai danh sách riêng biệt. Ví dụ, đây là những gì xảy ra khi bạn cố gắng sao chép một danh sách mà không sử dụng một slice:

my_foods = ['pizza', 'falafel', 'carrot cake']
# This doesn't work:
friend_foods = my_foods
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)

Thay vì gán một bản sao của my_foods cho friend_foods, chúng ta đặt friend_foods bằng my_foods. Cú pháp này thực sự cho Python biết liên kết biến mới friend_foods với danh sách đã được liên kết với my_foods, vì vậy bây giờ cả hai biến đều trỏ đến cùng một danh sách. Kết quả là, khi chúng ta thêm 'cannoli' vào my_foods, nó cũng sẽ xuất hiện trong friend_foods. Tương tự, 'ice cream' sẽ xuất hiện trong cả hai danh sách, mặc dù nó dường như chỉ được thêm vào friend_foods.

Đầu ra cho thấy rằng cả hai danh sách bây giờ đều giống nhau, điều này không phải là những gì chúng ta muốn:

My favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']
My friend's favorite foods are:
['pizza', 'falafel', 'carrot cake', 'cannoli', 'ice cream']

Làm thêm nhiều bài tập miễn phí tại đây

Comments

There are no comments at the moment.