Vào cuối bài học trước, chúng tôi nhận thấy rằng
1
True
['word', 123]
3 đã cung cấp cho chúng tôi một cấu trúc dữ liệu mới. một danh sách. Danh sách là một tập hợp các đối tượng được bao quanh bởi một tập hợp các dấu ngoặc vuông [1
True
['word', 123]
4]example = [1, 2, 4, 5]
example
[1, 2, 4, 5]
Lưu ý rằng một danh sách có thể chứa bất kỳ loại mục nào, kể cả các danh sách khác
example = [1, True, None, ["word", 123], "test"]
example
[1, True, None, ['word', 123], 'test']
Chúng tôi có thể nhận được các phần khác nhau của danh sách thông qua lập chỉ mục. Chúng tôi thêm một bộ dấu ngoặc vuông sau danh sách được đề cập cùng với chỉ mục của các giá trị mà chúng tôi muốn. Lưu ý rằng trong Python, tất cả các chỉ số bắt đầu từ 0 — phần tử đầu tiên thực sự là phần tử thứ 0 [điều này khác với các ngôn ngữ như R hoặc MATLAB]. Cách tốt nhất để nghĩ về các chỉ số mảng là chúng là số phần bù từ vị trí đầu tiên — phần tử đầu tiên không yêu cầu phần bù để đến
Một vài ví dụ về điều này trong hành động
# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
1
True
['word', 123]
Lưu ý rằng chúng ta có thể lập chỉ mục một phạm vi bằng cách sử dụng toán tử dấu hai chấm [
1
True
['word', 123]
5]. Bản thân dấu hai chấm có nghĩa là lấy mọi thứexample[:]
[1, True, None, ['word', 123], 'test']
Dấu hai chấm ở bên phải của chỉ mục có nghĩa là mọi thứ sau chỉ mục đã chỉ định
1
True
['word', 123]
11
True
['word', 123]
2Dấu hai chấm ở bên trái của chỉ mục có nghĩa là mọi thứ trước đó, nhưng không bao gồm, chỉ mục
[1, 2, 4, 5]
0[1, 2, 4, 5]
1Và nếu chúng ta sử dụng chỉ số âm, điều đó có nghĩa là lấy các phần tử từ cuối, đi ngược lại
[1, 2, 4, 5]
2[1, 2, 4, 5]
3Lưu ý rằng chúng ta có thể sử dụng chỉ mục nhiều lần để lấy thông tin từ các đối tượng lồng nhau
[1, 2, 4, 5]
4[1, 2, 4, 5]
5Nếu chúng tôi lập chỉ mục ngoài phạm vi, đó là một lỗi
[1, 2, 4, 5]
6[1, 2, 4, 5]
7Chúng ta cũng có thể cộng hai danh sách lại với nhau để tạo danh sách lớn hơn
[1, 2, 4, 5]
8[1, 2, 4, 5]
9Danh sách dưới dạng đối tượng
Giống như các đối tượng khác trong Python, danh sách có một hành vi độc đáo có thể khiến nhiều người mất cảnh giác. Điều gì xảy ra khi chúng ta chạy đoạn mã sau?
example = [1, True, None, ["word", 123], "test"]
example
0example = [1, True, None, ["word", 123], "test"]
example
1Sửa đổi
1
True
['word', 123]
6 cũng thực sự sửa đổi 1
True
['word', 123]
7. Trong Python, danh sách là đối tượng. Các đối tượng không được sao chép khi chúng ta gán chúng cho một giá trị mới [như trong R]. Đây là một tối ưu hóa quan trọng, vì chúng tôi sẽ không vô tình lấp đầy tất cả bộ nhớ của máy tính bằng cách đổi tên một biến một vài lần. Khi chúng tôi chạy 1
True
['word', 123]
8, nó chỉ tạo một tên mới cho 1
True
['word', 123]
7. 1
True
['word', 123]
7 vẫn chỉ vào cùng một đối tượng bên dướiChúng ta có thể xác minh điều này bằng hàm
example[:]
1. example[:]
1 in mã định danh duy nhất của đối tượng. Hai đối tượng sẽ không có cùng ID trừ khi chúng là cùng một đối tượngexample = [1, True, None, ["word", 123], "test"]
example
2example = [1, True, None, ["word", 123], "test"]
example
3Để tạo
1
True
['word', 123]
6 như một bản sao duy nhất của 1
True
['word', 123]
7. Chúng ta phải sử dụng phương pháp example[:]
5example = [1, True, None, ["word", 123], "test"]
example
4example = [1, True, None, ["word", 123], "test"]
example
5example[:]
5 là một phương pháp. Các phương thức là các chức năng đặc biệt được liên kết với một đối tượng và xác định những gì nó có thể làm. Chúng luôn tuân theo cú pháp example[:]
7 và có số lượng đối số được xác định trước chủ yếu với các giá trị mặc định. Chúng tôi cũng có thể chỉ định một tập hợp con của các đối số, e. g. example[:]
8Các phương pháp danh sách thường được sử dụng khác bao gồm
example[:]
9example = [1, True, None, ["word", 123], "test"]
example
6example = [1, True, None, ["word", 123], "test"]
example
7example = [1, True, None, ["word", 123], "test"]
example
8example = [1, True, None, ["word", 123], "test"]
example
9Và
[1, True, None, ['word', 123], 'test']
0 [kết hợp hai danh sách, thay vì thêm danh sách thứ hai làm phần tử][1, True, None, ['word', 123], 'test']
0[1, True, None, ['word', 123], 'test']
1Và tất nhiên,
[1, True, None, ['word', 123], 'test']
1 và [1, True, None, ['word', 123], 'test']
2 [cả hai đều làm chính xác những gì bạn nghĩ họ nên làm][1, True, None, ['word', 123], 'test']
2[1, True, None, ['word', 123], 'test']
3Thay đổi kích thước động của danh sách
Danh sách của Python là một cấu trúc dữ liệu cực kỳ tối ưu hóa. Không giống như các vectơ của R, không có thời gian phạt để liên tục thêm các phần tử vào danh sách. Bạn không bao giờ cần phân bổ trước danh sách ở một kích thước nhất định vì lý do hiệu suất
Lặp qua danh sách
Chúng tôi sẽ rất thường xuyên muốn lặp lại các danh sách và thực hiện một thao tác với mọi phần tử. Chúng tôi làm điều này bằng cách sử dụng vòng lặp for
Một vòng lặp for thường trông giống như sau
[1, True, None, ['word', 123], 'test']
4Một ví dụ về vòng lặp for thực sự hoạt động được hiển thị bên dưới
[1, True, None, ['word', 123], 'test']
5[1, True, None, ['word', 123], 'test']
6Trong trường hợp này, chúng tôi đang lặp lại các giá trị được cung cấp bởi
[1, True, None, ['word', 123], 'test']
3. [1, True, None, ['word', 123], 'test']
3 là một hàm tạo đặc biệt mà chúng ta có thể sử dụng để cung cấp một chuỗi sốChúng tôi cũng có thể lặp qua một danh sách hoặc bất kỳ tập hợp các phần tử nào
[1, True, None, ['word', 123], 'test']
7[1, True, None, ['word', 123], 'test']
8Các hoạt động được vector hóa với Numpy
Numpy là một thư viện số được thiết kế để làm việc với các số dễ dàng hơn so với cách khác
Ví dụ: giả sử chúng tôi có một danh sách hàng nghìn số. Không có cách nào để làm toán vectơ mà không lặp qua tất cả các phần tử
[1, True, None, ['word', 123], 'test']
9# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
0đó là rất nhiều việc. Numpy cho phép chúng tôi thực hiện các phép toán vectơ như trong R, giúp chúng tôi tiết kiệm rất nhiều công sức. Hàm cơ bản nhất là
[1, True, None, ['word', 123], 'test']
5 tạo một mảng số từ danh sách. Một mảng numpy là một tập hợp các số có thể có bất kỳ số thứ nguyên nào. Trong trường hợp này, chỉ có một chiều, vì chúng ta đã tạo mảng từ danh sách# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
1# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
2Một điều rất hay về Numpy là nó hoạt động hiệu quả hơn nhiều so với các danh sách Python thông thường. Một thủ thuật hay mà chúng ta có thể sử dụng với IPython để đo thời gian thực hiện là hàm ma thuật
[1, True, None, ['word', 123], 'test']
6. Bất cứ thứ gì sau [1, True, None, ['word', 123], 'test']
6 đều được đo tốc độ. Thêm [1, True, None, ['word', 123], 'test']
8 vào lệnh [1, True, None, ['word', 123], 'test']
9 thay vì 1
True
['word', 123]
10 có nghĩa là [1, True, None, ['word', 123], 'test']
9 được chạy trên toàn bộ ô, không chỉ một dòng. Lưu ý rằng 1
True
['word', 123]
12 phải nằm trên dòng đầu tiên của ô IPython/Jupyter để nó hoạt động, trong khi lệnh [1, True, None, ['word', 123], 'test']
6 có thể được sử dụng ở mọi nơiSử dụng danh sách của Python
# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
3# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
4sử dụng numpy
# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
5# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
6Numpy nhanh hơn khoảng 100 lần, đến _______ 56 đã đề cập rằng Numpy có thể gian lận một chút. Tuy nhiên, ngay cả trong trường hợp xấu nhất của Numpy, nó vẫn chạy nhanh hơn gấp 5 lần so với sử dụng danh sách cơ bản của Python
Làm việc với nhiều chiều
Đôi khi, bạn sẽ gặp một tập dữ liệu có nhiều thứ nguyên và sẽ cần có khả năng truy xuất các phần tử từ tập dữ liệu đó như vậy
# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
7# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
8Trong trường hợp này, chúng ta phải lập chỉ mục bằng cách sử dụng nhiều chỉ mục, được phân tách bằng dấu phẩy
Để lấy phần tử đầu tiên, chúng tôi sẽ sử dụng
1
True
['word', 123]
15# first element
example[0]
# second element
example[1]
# fetch the list inside the list
example[3]
91
True
['word', 123]
0Chỉ mục đầu tiên tương ứng với hàng, chỉ mục thứ hai tương ứng với cột và chỉ mục thứ ba tương ứng với kích thước tiếp theo…