Danh sách Python

Python có một loại danh sách tích hợp tuyệt vời có tên là "list". Danh sách cố định được viết trong dấu ngoặc vuông [ ]. Danh sách hoạt động tương tự như chuỗi – sử dụng hàm len() và dấu ngoặc vuông [ ] để truy cập dữ liệu, với phần tử đầu tiên tại chỉ mục 0. (Xem tài liệu chính thức về danh sách python.org.)

  colors = ['red', 'blue', 'green']
  print(colors[0])    ## red
  print(colors[2])    ## green
  print(len(colors))  ## 3

danh sách chuỗi "đỏ" "xanh dương "xanh lục"

Việc gán = trên danh sách sẽ không tạo bản sao. Thay vào đó, thao tác gán sẽ khiến 2 biến trỏ đến một danh sách trong bộ nhớ.

  b = colors   ## Does not copy the list

cả màu sắc và b trỏ đến một danh sách

"Danh sách trống" chỉ là một cặp dấu ngoặc vuông [ ]. '+' hoạt động để nối hai danh sách, vì vậy [1, 2] + [3, 4] mang lại [1, 2, 3, 4] (điều này giống như + với chuỗi).

CHO và IN

Các cấu trúc *for* và *in* của Python cực kỳ hữu ích và cách sử dụng đầu tiên chúng ta sẽ thấy là với các danh sách. Cấu trúc *for* – for var in list – là một cách dễ dàng để xem xét từng phần tử trong một danh sách (hoặc bộ sưu tập khác). Không thêm hoặc xoá khỏi danh sách trong quá trình lặp lại.

  squares = [1, 4, 9, 16]
  sum = 0
  for num in squares:
    sum += num
  print(sum)  ## 30

Nếu bạn biết loại dữ liệu nào trong danh sách, hãy sử dụng tên biến trong vòng lặp để ghi lại thông tin đó, chẳng hạn như "num", "name" hoặc "url". Vì mã Python không có cú pháp khác để nhắc bạn về loại, nên tên biến là một cách quan trọng để bạn tiếp tục hiểu đúng vấn đề. (Điều này hơi gây hiểu lầm. Khi tìm hiểu thêm về python, bạn sẽ thấy các tham chiếu đến gợi ý về loại (type gợi ý) cho phép bạn thêm thông tin nhập vào định nghĩa hàm. Python không sử dụng các gợi ý loại này khi chạy chương trình của bạn. Những công cụ này được các chương trình khác như IDE (môi trường phát triển tích hợp) và các công cụ phân tích tĩnh như trình tìm lỗi mã nguồn/trình kiểm tra kiểu sử dụng để xác thực xem các hàm của bạn có được gọi bằng các đối số tương thích hay không.)

Riêng cấu trúc *in* là một cách dễ dàng để kiểm tra xem một phần tử có xuất hiện trong danh sách (hoặc bộ sưu tập khác) hay không – value in collection – kiểm tra xem giá trị có trong tập hợp hay không, trả về True/False.

  list = ['larry', 'curly', 'moe']
  if 'curly' in list:
    print('yay') ## yay

Cấu trúc for/in rất thường dùng trong mã Python và hoạt động trên các loại dữ liệu khác ngoài danh sách, vì vậy bạn chỉ cần ghi nhớ cú pháp của chúng. Bạn có thể có thói quen với các ngôn ngữ khác, đó là bạn bắt đầu lặp lại theo cách thủ công qua một bộ sưu tập, trong đó bạn chỉ nên sử dụng for/in trong Python.

Bạn cũng có thể dùng for/in để xử lý một chuỗi. Chuỗi đóng vai trò như một danh sách các ký tự, vì vậy for ch in s: print(ch) in tất cả các ký tự trong một chuỗi.

Phạm vi

Hàm phạm vi(n) mang lại các số 0, 1, ... n-1 và phạm vi(a, b) trả về a, a + 1, ... b-1 - tối đa nhưng không bao gồm số cuối cùng. Sự kết hợp giữa vòng lặp for và hàm Range() cho phép bạn tạo một số truyền thống cho vòng lặp:

  ## print the numbers from 0 through 99
  for i in range(100):
    print(i)

Có một biến thể xrange() giúp tránh chi phí xây dựng toàn bộ danh sách cho các trường hợp nhạy cảm về hiệu suất (trong Python 3, Range() sẽ có hành vi hiệu suất tốt và bạn có thể quên đi xrange()).

Vòng lặp while

Python cũng có vòng lặp while tiêu chuẩn, các câu lệnh *break* và *continue* hoạt động như trong C++ và Java, làm thay đổi tiến trình của vòng lặp trong cùng. Vòng lặp for/in ở trên giải quyết trường hợp phổ biến là lặp lại mọi phần tử trong danh sách, nhưng vòng lặp while cung cấp cho bạn toàn quyền kiểm soát các số chỉ mục. Sau đây là vòng lặp while truy cập vào mọi phần tử thứ 3 trong danh sách:

  ## Access every 3rd element in a list
  i = 0
  while i < len(a):
    print(a[i])
    i = i + 3

Phương thức danh sách

Sau đây là một số phương thức danh sách phổ biến khác.

  • list.append(elem) -- thêm một phần tử vào cuối danh sách. Lỗi thường gặp: không trả về danh sách mới, chỉ sửa đổi danh sách gốc.
  • list.insert(index, elem) – chèn phần tử tại chỉ mục đã cho, dịch chuyển các phần tử sang phải.
  • list.extend(list2) thêm các phần tử trong list2 vào cuối danh sách. Sử dụng + hoặc += trong một danh sách tương tự như sử dụng Extend().
  • list.index(elem) -- tìm kiếm phần tử đã cho từ đầu danh sách và trả về chỉ mục của phần tử đó. Gửi ValueError nếu phần tử không xuất hiện (sử dụng "in" để kiểm tra mà không có ValueError).
  • list.remove(elem) – tìm kiếm bản sao đầu tiên của phần tử đã cho và loại bỏ phần tử đó (gửi ValueError nếu không có)
  • list.sort() -- sắp xếp danh sách tại chỗ (không trả về danh sách). (Hàm được sắp xếp() hiển thị sau đó được ưu tiên.)
  • list.reverse() – đảo ngược danh sách tại chỗ (không trả về danh sách)
  • list.pop(index) – xoá và trả về phần tử ở chỉ mục đã cho. Trả về phần tử ngoài cùng bên phải nếu chỉ mục bị bỏ qua (gần như đối lập với Extension()).

Xin lưu ý rằng đây là các *phương thức* trên đối tượng danh sách, trong khi len() là một hàm nhận danh sách (hoặc chuỗi hay bất kỳ phương thức nào) làm đối số.

  list = ['larry', 'curly', 'moe']
  list.append('shemp')         ## append elem at end
  list.insert(0, 'xxx')        ## insert elem at index 0
  list.extend(['yyy', 'zzz'])  ## add list of elems at end
  print(list)  ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz']
  print(list.index('curly'))    ## 2

  list.remove('curly')         ## search and remove that element
  list.pop(1)                  ## removes and returns 'larry'
  print(list)  ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']

Lỗi thường gặp: lưu ý rằng các phương thức trên không *trả về* danh sách đã sửa đổi, mà chỉ sửa đổi danh sách ban đầu.

  list = [1, 2, 3]
  print(list.append(4))   ## NO, does not work, append() returns None
  ## Correct pattern:
  list.append(4)
  print(list)  ## [1, 2, 3, 4]

Tạo danh sách

Một mẫu phổ biến là bắt đầu danh sách dưới dạng danh sách trống [], sau đó sử dụng màu thêm (hoặc mở rộng) để thêm các phần tử vào danh sách đó:

  list = []          ## Start as the empty list
  list.append('a')   ## Use append() to add elements
  list.append('b')

Liệt kê Lát cắt

Lát cắt hoạt động trên danh sách giống như với chuỗi và cũng có thể được dùng để thay đổi các phần phụ của danh sách.

  list = ['a', 'b', 'c', 'd']
  print(list[1:-1])   ## ['b', 'c']
  list[0:2] = 'z'    ## replace ['a', 'b'] with ['z']
  print(list)         ## ['z', 'c', 'd']

Bài tập: list1.py

Để thực hành nội dung trong phần này, hãy thử các bài toán trong list1.py không sử dụng tính năng sắp xếp (trong Bài tập cơ bản).