Thứ tư, 02/11/2016 | 00:00 GMT+7

Hiểu danh sách trong Python 3

Danh sách là một cấu trúc dữ liệu trong Python, là một chuỗi các phần tử có thứ tự có thể thay đổi hoặc có thể thay đổi. Mỗi phần tử hoặc giá trị nằm trong danh sách được gọi là một mục. Cũng giống như các chuỗi được định nghĩa là các ký tự giữa các dấu ngoặc kép, danh sách được xác định bằng cách có các giá trị giữa các dấu ngoặc vuông [ ] .

Danh sách rất tốt để sử dụng khi bạn muốn làm việc với nhiều giá trị liên quan. Chúng cho phép bạn giữ dữ liệu cùng nhau thuộc về nhau, cô đọng mã của bạn và thực hiện các phương pháp và hoạt động giống nhau trên nhiều giá trị cùng một lúc.

Khi nghĩ về danh sách Python và các cấu trúc dữ liệu khác là các loại bộ sưu tập, sẽ hữu ích khi xem xét tất cả các bộ sưu tập khác nhau mà bạn có trên máy tính của bạn : loại file , danh sách phát bài hát, dấu trang trình duyệt, email của bạn, bộ sưu tập video bạn có thể truy cập trên một dịch vụ phát trực tuyến và hơn thế nữa.

Để bắt đầu, hãy tạo một danh sách có chứa các mục của kiểu dữ liệu chuỗi:

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone'] 

Khi ta in danh sách ra, kết quả giống hệt như danh sách ta đã tạo:

print(sea_creatures) 
Output
['shark', 'cuttlefish', 'squid', 'mantis shrimp', 'anemone']

Là một chuỗi các phần tử có thứ tự, mỗi mục trong danh sách có thể được gọi riêng lẻ, thông qua việc lập index . Danh sách là một kiểu dữ liệu phức hợp được tạo thành từ các phần nhỏ hơn và rất linh hoạt vì chúng có thể có các giá trị được thêm, bớt và thay đổi. Khi bạn cần lưu trữ nhiều giá trị hoặc lặp qua các giá trị và bạn muốn có thể dễ dàng sửa đổi các giá trị đó, bạn có thể sẽ muốn làm việc với các kiểu dữ liệu danh sách.

Trong hướng dẫn này, ta sẽ xem xét một số cách mà ta có thể làm việc với danh sách bằng Python.

Danh sách lập index

Mỗi mục trong danh sách tương ứng với một số index , là một giá trị số nguyên, bắt đầu bằng số index 0 .

Đối với danh sách sea_creatures , bảng phân tích index trông giống như sau:

'cá mập' 'mực nang' 'mực ống' 'tôm bọ ngựa' 'hải quỳ'
0 1 2 3 4

Mục đầu tiên, chuỗi 'shark' bắt đầu ở index 0 và danh sách kết thúc ở index 4 với mục 'anemone' .

Bởi vì mỗi mục trong danh sách Python có một số index tương ứng, ta có thể truy cập và thao tác danh sách theo những cách giống như ta có thể làm với các kiểu dữ liệu tuần tự khác.

Bây giờ ta có thể gọi một mục rời rạc của danh sách bằng cách tham chiếu đến số index của nó:

print(sea_creatures[1]) 
Output
cuttlefish

Các số index cho danh sách này nằm trong repository ảng từ 0 - 4 , như trong bảng trên. Vì vậy, để gọi bất kỳ mục riêng lẻ nào, ta sẽ tham chiếu đến các số index như sau:

sea_creatures[0] = 'shark' sea_creatures[1] = 'cuttlefish' sea_creatures[2] = 'squid' sea_creatures[3] = 'mantis shrimp' sea_creatures[4] = 'anemone' 

Nếu ta gọi danh sách sea_creatures với số index của bất kỳ lớn hơn 4, nó sẽ nằm ngoài phạm vi vì nó sẽ không hợp lệ:

print(sea_creatures[18]) 
Output
IndexError: list index out of range

Ngoài các số index dương, ta cũng có thể truy cập các mục từ danh sách với số index âm, bằng cách đếm ngược từ cuối danh sách, bắt đầu từ -1 . Điều này đặc biệt hữu ích nếu ta có một danh sách dài và ta muốn xác định một mục ở cuối danh sách.

Đối với cùng một danh sách sea_creatures , bảng phân tích index phủ định sẽ giống như sau:

'cá mập' 'mực nang' 'mực ống' 'tôm bọ ngựa' 'hải quỳ'
-5 -4 -3 -2 -1

Vì vậy, nếu ta muốn in ra mặt hàng 'squid' bằng cách sử dụng số index âm của nó, ta có thể làm như sau:

print(sea_creatures[-3]) 
Output
squid

Ta có thể nối các mục chuỗi trong danh sách với các chuỗi khác bằng cách sử dụng toán tử + :

print('Sammy is a ' + sea_creatures[0]) 
Output
Sammy is a shark

Ta đã có thể nối mục chuỗi ở index số 0 với chuỗi 'Sammy is a ' . Ta cũng có thể sử dụng toán tử + để nối 2 hoặc nhiều danh sách với nhau .

Với số index tương ứng với các mục trong danh sách, ta có thể truy cập từng mục của danh sách một cách riêng biệt và làm việc với các mục đó.

Sửa đổi các mục trong danh sách

Ta có thể sử dụng lập index để thay đổi các mục trong danh sách bằng cách đặt số index bằng một giá trị khác. Điều này cho phép ta kiểm soát tốt hơn các danh sách vì ta có thể sửa đổi và cập nhật các mục chứa chúng.

Nếu ta muốn thay đổi giá trị chuỗi của mặt hàng ở index 1 từ 'cuttlefish' thành 'octopus' , ta có thể làm như sau:

sea_creatures[1] = 'octopus' 
print(sea_creatures) 
Output
['shark', 'octopus', 'squid', 'mantis shrimp', 'anemone']

Ta cũng có thể thay đổi giá trị của một mục bằng cách sử dụng số index âm để thay thế:

sea_creatures[-3] = 'blobfish' print(sea_creatures) 
Output
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone']

Bây giờ 'blobfish' đã thay thế 'squid' ở số điện thoại chỉ số tiêu cực của -3 (mà tương ứng với số lượng chỉ số tích cực của 2 ).

Có thể sửa đổi các mục trong danh sách cho phép ta thay đổi và cập nhật danh sách một cách hiệu quả.

Danh sách Slicing

Ta cũng có thể gọi ra một vài mục trong danh sách. Giả sử ta chỉ muốn in các mục ở giữa của sea_creatures , ta có thể thực hiện bằng cách tạo một lát cắt . Với các lát cắt, ta có thể gọi nhiều giá trị bằng cách tạo một dải số index được phân tách bằng dấu hai chấm [x:y] :

print(sea_creatures[1:4]) 
Output
['octopus', 'blobfish', 'mantis shrimp']

Khi tạo một lát cắt, như trong [1:4] , số index đầu tiên là nơi lát bắt đầu (bao gồm) và số index thứ hai là nơi lát kết thúc (độc quyền), đó là lý do tại sao trong ví dụ của ta ở trên, các mục tại vị trí, 1 , 23 là các mục in ra.

Nếu ta muốn đưa vào một trong hai phần cuối của danh sách, ta có thể bỏ qua một trong các số trong cú pháp list[x:y] của list[x:y] . Ví dụ: nếu ta muốn in 3 mục đầu tiên của danh sách sea_creatures - sẽ là 'shark' , 'octopus' , 'blobfish' - ta có thể thực hiện bằng cách nhập:

print(sea_creatures[:3]) 
Output
['shark', 'octopus', 'blobfish']

Điều này đã in phần đầu của danh sách, dừng ngay trước index 3 .

Để bao gồm tất cả các mục ở cuối danh sách, ta sẽ đảo ngược cú pháp:

print(sea_creatures[2:]) 
Output
['blobfish', 'mantis shrimp', 'anemone']

Ta cũng có thể sử dụng số index âm khi cắt danh sách, giống như với số index dương:

print(sea_creatures[-4:-2]) print(sea_creatures[-3:]) 
Output
['octopus', 'blobfish'] ['blobfish', 'mantis shrimp', 'anemone']

Một tham số cuối cùng mà ta có thể sử dụng với quá trình cắt được gọi là bước đi , đề cập đến số lượng mục cần chuyển tiếp sau khi mục đầu tiên được truy xuất từ danh sách. Lúc này, ta đã bỏ qua tham số bước và Python mặc định là bước bằng 1, để mọi mục giữa hai số index đều được truy xuất.

Cú pháp của cấu trúc này là list[x:y:z] , với z là sải chân. Hãy tạo một danh sách lớn hơn, sau đó chia nhỏ nó và cung cấp giá trị cho bước đi là 2:

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]  print(numbers[1:11:2]) 
Output
[1, 3, 5, 7, 9]

Các numbers[1:11:2] xây dựng của ta numbers[1:11:2] in ra các giá trị giữa các số index bao gồm 1 và không bao gồm 11 , sau đó giá trị bước của 2 yêu cầu chương trình chỉ in ra mọi mục khác.

Ta có thể bỏ qua hai tham số đầu tiên và chỉ sử dụng stride làm tham số với list[::z] cú pháp list[::z] :

print(numbers[::3]) 
Output
[0, 3, 6, 9, 12]

Bằng cách in ra các numbers trong danh sách với bước số được đặt thành 3 , chỉ mỗi mục thứ ba được in:

0 , 1, 2, 3 , 4, 5, 6 , 7, 8, 9 , 10, 11, 12

Việc cắt các danh sách với cả số chỉ số dương và âm và cho biết bước tiến cung cấp cho ta quyền kiểm soát để thao tác danh sách và nhận kết quả mà ta đang cố gắng đạt được.

Sửa đổi danh sách với các nhà khai thác

Các toán tử được dùng để sửa đổi danh sách. Ta sẽ xem xét việc sử dụng các toán tử +* và các dạng ghép của chúng +=*= .

Toán tử + được dùng để nối hai hoặc nhiều danh sách với nhau:

sea_creatures = ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone'] oceans = ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']  print(sea_creatures + oceans) 
Output
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']

Vì toán tử + có thể nối, nó được dùng để thêm một mục (hoặc một số) ở dạng danh sách vào cuối danh sách khác. Hãy nhớ đặt mục trong dấu ngoặc vuông:

sea_creatures = sea_creatures + ['yeti crab'] print (sea_creatures) 
Output
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']

Toán tử * được dùng để nhân danh sách. Có lẽ bạn cần tạo bản sao của tất cả các file trong một folder lên server hoặc chia sẻ danh sách phát với bạn bè - trong những trường hợp này, bạn cần nhân bộ sưu tập dữ liệu.

Hãy nhân danh sách sea_creatures với 2 và danh sách oceans với 3:

print(sea_creatures * 2) print(oceans * 3) 
Output
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab'] ['Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic', 'Pacific', 'Atlantic', 'Indian', 'Southern', 'Arctic']

Bằng cách sử dụng toán tử * ta có thể sao chép danh sách của bạn theo số lần ta chỉ định.

Ta cũng có thể sử dụng các dạng ghép của toán tử +* với toán tử gán = . Các toán tử kết hợp +=*= được dùng để điền danh sách một cách nhanh chóng và tự động. Bạn có thể sử dụng các toán tử này để điền vào danh sách với các trình giữ chỗ mà bạn có thể sửa đổi sau này với đầu vào do user cung cấp, chẳng hạn.

Hãy thêm một mục ở dạng danh sách vào danh sách sea_creatures . Mục này sẽ hoạt động như một trình giữ chỗ và ta muốn thêm mục giữ chỗ này nhiều lần. Để làm điều này, ta sẽ sử dụng toán tử += với vòng lặp for .

for x in range(1,4):     sea_creatures += ['fish']     print(sea_creatures) 
Output
['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish'] ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish'] ['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab', 'fish', 'fish', 'fish']

Đối với mỗi lần lặp lại của vòng lặp for, một mục danh sách bổ sung của 'fish' được thêm vào danh sách ban đầu sea_creatures .

Toán tử *= hoạt động theo cách tương tự:

sharks = ['shark']  for x in range(1,4):     sharks *= 2     print(sharks) 
Output
['shark', 'shark'] ['shark', 'shark', 'shark', 'shark'] ['shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark']

Các toán tử +* được dùng để nối danh sách và nhân danh sách. Các toán tử ghép +=*= có thể nối danh sách và nhân danh sách và chuyển danh tính mới cho danh sách ban đầu.

Xóa một mục khỏi danh sách

Các mục có thể được xóa khỏi danh sách bằng cách sử dụng câu lệnh del . Thao tác này sẽ xóa giá trị ở số index bạn chỉ định trong danh sách.

Từ danh sách sea_creatures , hãy xóa mục 'octopus' . Mục này nằm ở vị trí index của 1 . Để xóa mục, ta sẽ sử dụng câu lệnh del sau đó gọi biến danh sách và số index của mục đó:

sea_creatures =['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']  del sea_creatures[1] print(sea_creatures) 
Output
['shark', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']

Bây giờ mục ở vị trí index 1 , chuỗi 'octopus' , không còn trong danh sách sea_creatures của ta .

Ta cũng có thể chỉ định một phạm vi bằng câu lệnh del . Giả sử ta muốn xóa không index 'octopus' , mà còn cả 'blobfish''mantis shrimp' . Ta có thể gọi một phạm vi trong sea_creatures với câu lệnh del để thực hiện điều này:

sea_creatures =['shark', 'octopus', 'blobfish', 'mantis shrimp', 'anemone', 'yeti crab']  del sea_creatures[1:4] print(sea_creatures) 
Output
['shark', 'anemone', 'yeti crab']

Bằng cách sử dụng một dải ô với câu lệnh del , ta có thể xóa các mục giữa số index là 1 (bao gồm) và số index là 4 (loại trừ), để lại cho ta danh sách gồm 3 mục sau khi loại bỏ 3 mục .

Câu lệnh del cho phép ta xóa các mục cụ thể khỏi kiểu dữ liệu danh sách.

Tạo một danh sách với các mục danh sách

Danh sách có thể được xác định với các mục được tạo thành từ danh sách, với mỗi danh sách được đặt trong ngoặc vuông được đặt bên trong dấu ngoặc lớn hơn của danh sách mẹ:

sea_names = [['shark', 'octopus', 'squid', 'mantis shrimp'],['Sammy', 'Jesse', 'Drew', 'Jamie']] 

Các danh sách này trong danh sách được gọi là danh sách lồng nhau.

Để truy cập một mục trong danh sách này, ta sẽ phải sử dụng nhiều chỉ số:

print(sea_names[1][0]) print(sea_names[0][0]) 
Output
Sammy shark

Danh sách đầu tiên, vì nó bằng một mục, sẽ có số index là 0, đây sẽ là số đầu tiên trong cấu trúc và danh sách thứ hai sẽ có số index là 1. Trong mỗi danh sách lồng nhau bên trong sẽ có các số index riêng biệt, mà ta sẽ gọi trong số index thứ hai:

sea_names[0][0] = 'shark' sea_names[0][1] = 'octopus' sea_names[0][2] = 'squid' sea_names[0][3] = 'mantis shrimp'  sea_names[1][0] = 'Sammy' sea_names[1][1] = 'Jesse' sea_names[1][2] = 'Drew' sea_names[1][3] = 'Jamie' 

Khi làm việc với danh sách các danh sách, điều quan trọng cần nhớ là bạn cần tham khảo nhiều hơn một số index để truy cập các mục cụ thể trong danh sách lồng nhau có liên quan.

Kết luận

Kiểu dữ liệu danh sách là kiểu dữ liệu linh hoạt có thể được sửa đổi trong suốt chương trình của bạn. Hướng dẫn này bao gồm các tính năng cơ bản của danh sách, bao gồm lập index , phân loại, sửa đổi và nối danh sách.

Từ đây, bạn có thể tìm hiểu thêm về cách làm việc với danh sách trong Python bằng cách đọc “ Cách sử dụng các phương pháp danh sách ” và về cách hiểu danh sách để tạo danh sách dựa trên danh sách hiện có. Để tìm hiểu thêm về các loại dữ liệu nói chung, bạn có thể đọc hướng dẫn " Hiểu về các loại dữ liệu " của ta .


Tags:

Các tin liên quan

Cách làm Toán bằng Python 3 với Toán tử
2016-11-01
Giới thiệu về các hàm chuỗi trong Python 3
2016-11-01
Giới thiệu về các hàm chuỗi trong Python 3
2016-11-01
Giới thiệu về các hàm chuỗi trong Python 3
2016-11-01
Cách sử dụng bộ định dạng chuỗi trong Python 3
2016-10-14
Cách xử lý tệp văn bản thuần túy trong Python 3
2016-10-13
Cách sử dụng các biến trong Python 3
2016-10-12
Cách lập chỉ mục và cắt chuỗi trong Python 3
2016-09-28
Cách định dạng văn bản trong Python 3
2016-09-15
Giới thiệu về cách làm việc với chuỗi trong Python 3
2016-09-15