Một danh sách trong python là dữ liệu được phân tách bằng dấu phẩy trong ngoặc vuông. Tại đây, chúng tôi có thể lưu trữ dữ liệu sau trong một biến để mô tả các hệ số Antoine cho benzen và phạm vi chúng có liên quan cho [Tmin Tmax]. Danh sách rất linh hoạt, bạn có thể đặt bất cứ thứ gì vào đó, kể cả các danh sách khác. Chúng tôi truy cập các phần tử của danh sách bằng cách lập chỉ mục
c = ['benzene', 6.9056, 1211.0, 220.79, [-16, 104]] print c[0] print c[-1] a,b = c[0:2] print a,b name, A, B, C, Trange = c print Trange
benzene [-16, 104] benzene 6.9056 [-16, 104]
Danh sách là "có thể thay đổi", có nghĩa là bạn có thể thay đổi giá trị của chúng
a = [3, 4, 5, [7, 8], 'cat'] print a[0], a[-1] a[-1] = 'dog' print a
3 cat >>> [3, 4, 5, [7, 8], 'dog']
2 bộ
Tuples là bất biến; . Điều này rất hữu ích trong trường hợp có lỗi khi thay đổi giá trị. Một bộ giống như một danh sách nhưng nó được đặt trong dấu ngoặc đơn
a = [3, 4, 5, [7, 8], 'cat'] print a[0], a[-1] a[-1] = 'dog'
3 cat Traceback [most recent call last]: File "", line 1, in TypeError: 'tuple' object does not support item assignment
3 cấu trúc
Python không chính xác giống như một cấu trúc trong Matlab. Bạn có thể đạt được điều gì đó tương tự bằng cách định nghĩa một lớp trống và sau đó xác định các thuộc tính của lớp đó. Bạn có thể kiểm tra xem một đối tượng có thuộc tính cụ thể hay không bằng cách sử dụng hasattr
class Antoine: pass a = Antoine[] a.name = 'benzene' a.Trange = [-16, 104] print a.name print hasattr[a, 'Trange'] print hasattr[a, 'A']
benzene True False
4 từ điển
Tương tự của container. Bản đồ trong Matlab là từ điển trong python. Từ điển được đặt trong dấu ngoặc nhọn và bao gồm từ khóa. cặp giá trị
________số 8_______
{'A': 6.9056, 'C': 220.79, 'B': 1211.0, 'name': 'benzene', 'Trange': [-16, 104]} [-16, 104]
benzene [-16, 104] benzene 6.9056 [-16, 104]0
benzene [-16, 104] benzene 6.9056 [-16, 104]1
5 Tóm tắt
Chúng tôi đã kiểm tra bốn cấu trúc dữ liệu trong python. Lưu ý rằng không có loại nào trong số này là mảng/vectơ với các phép toán được xác định. Đối với những thứ đó, bạn cần xem xét numpy. mảng
Các cấu trúc có sẵn trong nhiều ngôn ngữ khác nhau, như C, C++, C# và MATLAB, và chúng chủ yếu được sử dụng để tổ chức dữ liệu dưới dạng các loại hỗn hợp, chứa một tập hợp các trường xác định. Trong C, C++ và C#, cấu trúc được định nghĩa là các kiểu dữ liệu mới và sau đó các biến mới của kiểu đó được khai báo. Trong C++ và C#, cấu trúc là các lớp và chúng cũng có thể bao gồm các phương thức và thành viên riêng. Ngược lại, cấu trúc MATLAB là một kiểu dữ liệu tổng quát để tổ chức và nhóm một số trường thuộc nhiều kiểu khác nhau, kể cả kiểu cấu trúc
Trong Python, có một số cách để có chức năng như cấu trúc
- sử dụng
struct[{'x': 3, 'y': 4, 'A': 12}]
3 [xem ], loại từ điển tích hợp sẵn trong Python, đây thực sự là một mảng khóa-giá trị của các mục; - sử dụng một lớp trống hoặc một lớp tạm thời, sau đó thêm các trường bắt buộc vào đó;
- sử dụng một lớp mã hóa cứng, với tất cả các trường và phương thức bắt buộc;
- và sử dụng lớp
struct[{'x': 3, 'y': 4, 'A': 12}]
4 [xem ], là một bộ có các khóa cho mỗi mục và đó là một loại bất biến
Không có giải pháp nào trong số này hoàn toàn giống với cấu trúc MATLAB. Để làm điều này, tôi đã phát triển một lớp con của
struct[{'x': 3, 'y': 4, 'A': 12}]
3, sử dụng toán tử struct[{'x': 3, 'y': 4, 'A': 12}]
6 [dấu chấm] để truy cập các trường, giống như cấu trúc MATLAB và C/C++/C#. Ngoài ra, nó có khả năng lấy danh sách các trường, thêm và xóa các trường, hợp nhất hai hoặc nhiều cấu trúc, lặp lại và sao chép, đồng thời tạo các bản sao nông và sâu, có nghĩa là các phương thức được xác định của nóDự án này được đặt tên là ypstruct, viết tắt của Yarpiz Structure, và mã nguồn của nó có sẵn trên GitHub [tại đây] và nó cũng được xuất bản trên PyPI, Python Package Index [tại đây]. Trong bài viết này, chúng ta sẽ xem cách cài đặt và sử dụng ypstruct để có trải nghiệm tương tự như các cấu trúc MATLAB trong Python
Cài đặtCách đơn giản nhất để cài đặt ypstruct trên máy của bạn là sử dụng pip. Chỉ cần chạy cái này trong terminal
pip install ypstruct
để cài đặt gói ypstruct trên máy tính của bạn
Ngoài ra, bạn có thể lấy mã nguồn từ kho lưu trữ ypstruct GitHub [tại đây] và đưa vào dự án hoặc thiết lập trên máy của bạn
Sử dụng cơ bảnKiểu cấu trúc trong gói ypstruct được xác định bởi lớp
struct[{'x': 3, 'y': 4, 'A': 12}]
7. Lớp này cũng có một tên bí danh, struct[{'x': 3, 'y': 4, 'A': 12}]
8. Bạn có thể bao gồm struct[{'x': 3, 'y': 4, 'A': 12}]
7 hoặc struct[{'x': 3, 'y': 4, 'A': 12}]
8từ gói này hoặc đơn giản là bao gồm mọi thứ có sẵn bằng cách sử dụng biểu tượng p = struct[x=3, y=4]
p.A = p.x * p.y
1Cách sử dụng đơn giản của
struct[{'x': 3, 'y': 4, 'A': 12}]
7 được đưa ra trong khối mã saufrom ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Đầu ra của mã này sẽ như sau
struct[{'x': 3, 'y': 4, 'A': 12}]
Trong khối mã ở trên, sau khi nhập các lớp ypstruct, một thể hiện của
struct[{'x': 3, 'y': 4, 'A': 12}]
7 được tạo và khởi tạo mà không có bất kỳ trường và dữ liệu nào trong đó. Sau đó, các trường p = struct[x=3, y=4]
p.A = p.x * p.y
4 và p = struct[x=3, y=4]
p.A = p.x * p.y
5 được đặt. Sau đó, giá trị của trường mới p = struct[x=3, y=4]
p.A = p.x * p.y
6, được xác định bằng cách sử dụng giá trị của hai trường khác. Cuối cùng, biểu diễn chuỗi của đối tượng cấu trúc được in raTrong đoạn mã này, có thể khởi tạo các trường và giá trị của chúng bằng cách sử dụng hàm tạo của lớp
struct[{'x': 3, 'y': 4, 'A': 12}]
7. Đó làp = struct[x=3, y=4]
p.A = p.x * p.y
____struct[{'x': 3, 'y': 4, 'A': 12}]
7 và struct[{'x': 3, 'y': 4, 'A': 12}]
3 có liên quan như thế nào?Bạn có thể truy cập các trường của một đối tượng cấu trúc bằng cách sử dụng toán tử
struct[{'x': 3, 'y': 4, 'A': 12}]
6 [dấu chấm], cũng như toán tử lập chỉ mục my_dict = {'x':3, 'y':4}
p = struct[my_dict]
1; . Vì vậy, my_dict = {'x':3, 'y':4}
p = struct[my_dict]
3 và my_dict = {'x':3, 'y':4}
p = struct[my_dict]
4 là tương đương và chúng có thể được sử dụng thay thế cho nhauNgoài ra, đối tượng cấu trúc [
struct[{'x': 3, 'y': 4, 'A': 12}]
7] có thể được chuyển đổi thành và tạo từ đối tượng từ điển [struct[{'x': 3, 'y': 4, 'A': 12}]
3]. Ví dụ: bạn có thể chuyển đổi đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
3 thành đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
7 như saumy_dict = {'x':3, 'y':4}
p = struct[my_dict]
Ngoài ra, đối tượng cấu trúc cũng có thể được chuyển đổi thành từ điển
p = struct[x=3, y=4]
p.z = 12
my_dict = dict[p]
print[my_dict]
Đầu ra của mã này được hiển thị dưới đây
{'x': 3, 'y': 4, 'z': 12}
Toán tử và phương thứcLớp
struct[{'x': 3, 'y': 4, 'A': 12}]
7 [cũng là bí danh của nó là struct[{'x': 3, 'y': 4, 'A': 12}]
8] thực hiện một số toán tử và phương thức, có thể được sử dụng để thay đổi dữ liệu trong cấu trúc và các trường của nó hoặc thực hiện các thao tác khác. Lưu ý rằng, bất kỳ phương thức hoặc toán tử nào được định nghĩa cho lớp struct[{'x': 3, 'y': 4, 'A': 12}]
3, cũng có sẵn cho các lớp nàyCác toán tử và phương thức được định nghĩa cho lớp
struct[{'x': 3, 'y': 4, 'A': 12}]
7 sẽ được thảo luận trong các phần sau của bài đăng nàyKết hợp cấu trúc sử dụng toán tử p = struct[x=3, y=4]
p.z = 12
my_dict = dict[p]
print[my_dict]
3
p.z = 12
my_dict = dict[p]
print[my_dict]
Sử dụng toán tử
p = struct[x=3, y=4]
p.z = 12
my_dict = dict[p]
print[my_dict]
3, có thể hợp nhất dữ liệu từ hai thể hiện của lớp struct[{'x': 3, 'y': 4, 'A': 12}]
7 để tạo đối tượng cấu trúc kết hợp. Ví dụ: chúng ta hãy xác định hai cấu trúc như saua = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
Hai đối tượng
struct[{'x': 3, 'y': 4, 'A': 12}]
7 này có thể được hợp nhất bằng cách sử dụng toán tử p = struct[x=3, y=4]
p.z = 12
my_dict = dict[p]
print[my_dict]
3c = a + b
print[c]
Mã này sẽ xuất ra
struct[{'x': 1, 'y': 5, 'z': 3, 't': 20, 'u': 30}]
Lưu ý rằng các giá trị từ toán hạng thứ hai [tức là
p = struct[x=3, y=4]
p.z = 12
my_dict = dict[p]
print[my_dict]
8] được sử dụng cho trường chung của hai cấu trúc. Vì vậy, chúng ta thấy giá trị 5 cho trường p = struct[x=3, y=4]
p.A = p.x * p.y
5 trong đối tượng cấu trúc được hợp nhất. Kết quả của thao tác hợp nhất là một cấu trúc chứa tất cả các trường được xác định trong toán hạngCác cấu trúc lặp sử dụng toán tử p = struct[x=3, y=4]
p.A = p.x * p.y
1 và phương pháp {'x': 3, 'y': 4, 'z': 12}
1
p.A = p.x * p.y
Đôi khi chúng ta cần lặp lại/nhân rộng một cấu trúc. Ví dụ: giả sử rằng chúng tôi sẽ triển khai Thuật toán tiến hóa và chúng tôi đã xác định các cá nhân là đối tượng
struct[{'x': 3, 'y': 4, 'A': 12}]
7. Đầu tiên chúng ta cần tạo một mẫufrom ypstruct import *p = struct[]0
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Sau đó, chúng ta có thể khởi tạo mảng dân số bằng đoạn mã sau
from ypstruct import *p = struct[]1
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Mã này sử dụng phương thức
{'x': 3, 'y': 4, 'z': 12}
1 để khởi tạo danh sách các đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
7 riêng biệt có cùng trường dữ liệuThay vì sử dụng phương thức
{'x': 3, 'y': 4, 'z': 12}
1, có thể sử dụng toán tử p = struct[x=3, y=4]
p.A = p.x * p.y
1 để thực hiện sao chép cấu trúc. Ví dụ: dòng thứ hai của khối mã trước đó có thể được viết lại bằng cách sử dụng toán tử p = struct[x=3, y=4]
p.A = p.x * p.y
1 như saufrom ypstruct import *p = struct[]2
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Lấy danh sách các trường được xác định bằng phương pháp {'x': 3, 'y': 4, 'z': 12}
8
Phương thức
{'x': 3, 'y': 4, 'z': 12}
8 trả về một a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
0 trường được xác định trong cấu trúc. Một ví dụ sử dụng saufrom ypstruct import *p = struct[]3
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
đầu ra sẽ là
from ypstruct import *p = struct[]4
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Có một danh sách các trường có thể lặp lại có thể hữu ích khi chúng ta sẽ thực hiện các thao tác trên các trường cấu trúc. Ví dụ, trong các bài toán tối ưu hóa thực tế, chúng ta xử lý các tập biến quyết định khác nhau thuộc nhiều loại khác nhau. Người ta có thể đóng gói các biến quyết định bên trong một đối tượng
struct[{'x': 3, 'y': 4, 'A': 12}]
7. Việc thực hiện các thao tác, như sửa đổi, phân tích cú pháp, tiền xử lý hoặc hậu xử lý các biến quyết định này, có thể dễ dàng hơn nhiều bằng cách lặp qua danh sách các biến quyết định, e. g. các trường được xác định của đối tượng cấu trúcThêm các trường mới bằng phương pháp a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
2
b = struct[y=5, t=20, u=30]
Có thể thêm một trường mới bằng cách sử dụng phương pháp
a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
2. Phương thức này chấp nhận hai đối số đầu vào. tên trường và giá trị của nó. Giá trị là tùy chọn và nếu nó bị bỏ qua, thì giá trị được giả định là a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
4. Một mã mẫu saufrom ypstruct import *p = struct[]5
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Mã này sẽ in ra văn bản này dưới dạng đầu ra
from ypstruct import *p = struct[]6
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Thay vì sử dụng phương thức
a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
2, có thể chỉ cần sử dụng toán tử struct[{'x': 3, 'y': 4, 'A': 12}]
6 [dấu chấm] và a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
7 [gán]. Ví dụ, mã được đề cập ở trên có thể được đơn giản hóa như thế nàyfrom ypstruct import *p = struct[]7
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Kết quả của hai khối mã này sẽ giống nhau
Loại bỏ các trường bằng phương pháp a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
8
b = struct[y=5, t=20, u=30]
Có thể xóa trường khỏi đối tượng
struct[{'x': 3, 'y': 4, 'A': 12}]
7 bằng phương pháp a = struct[x=1, y=2, z=3]
b = struct[y=5, t=20, u=30]
8. Phương thức này lấy tên trường và xóa [xóa] trường đã chỉ định khỏi đối tượng cấu trúc. Một ví dụ được đưa ra dưới đâyfrom ypstruct import *p = struct[]8
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Đầu ra sẽ là cái này
from ypstruct import *p = struct[]9
p.x = 3
p.y = 5
p.A = p.x * p.yprint[p]
Tạo bản sao bằng phương pháp c = a + b
print[c]
1 và c = a + b
print[c]
2
print[c]
print[c]
struct[{'x': 3, 'y': 4, 'A': 12}]
7 là một loại tài liệu tham khảo. Để có một bản sao của đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
7, bạn không thể chỉ sử dụng toán tử gán. Ví dụ, chúng ta hãy tạo một đối tượng cấu trúcstruct[{'x': 3, 'y': 4, 'A': 12}]
0Bây giờ chúng ta gán giá trị này cho một biến mới và sau đó cố gắng thay đổi giá trị của một trường
struct[{'x': 3, 'y': 4, 'A': 12}]
1Điều này cũng sẽ thay đổi cấu trúc đối tượng p. Bởi vì
c = a + b
print[c]
5 và c = a + b
print[c]
6 đang tham chiếu đến cùng một đối tượngĐể tạo các bản sao của các đối tượng cấu trúc, hai phương thức được triển khai trong lớp
struct[{'x': 3, 'y': 4, 'A': 12}]
7. c = a + b
print[c]
1 và c = a + b
print[c]
2. Cái đầu tiên cho chúng ta một bản sao nông của đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
7. Nhưng sử dụng c = a + b
print[c]
2, như tên gọi của phương thức, chúng ta có thể tạo các bản sao sâu của các đối tượng cấu trúcCách chính xác để tạo một bản sao của p như sau
struct[{'x': 3, 'y': 4, 'A': 12}]
2Lần này,
c = a + b
print[c]
6 đang tham chiếu đến một đối tượng struct[{'x': 3, 'y': 4, 'A': 12}]
7 khác [sự kiện có cùng giá trị] và việc sửa đổi nó sẽ không ảnh hưởng đến c = a + b
print[c]
5Phần kết luậnSử dụng
struct[{'x': 3, 'y': 4, 'A': 12}]
7 từ ypstruct có thể rất hữu ích trong việc triển khai các dự án và ứng dụng bằng Python. Nó tiết kiệm rất nhiều thời gian trong các dự án đang xử lý các kiểu dữ liệu giống như lớp với các trường và không có phương thức. Ngoài ra, nó sẽ hữu ích cho những người dùng MATLAB đang cố gắng triển khai lại các chương trình của họ bằng Python, đang sử dụng các cấu trúcTrước đây, tôi đã sử dụng ypstruct để triển khai các thuật toán và dự án khác nhau. Một số ví dụ được liệt kê dưới đây