Python lưu dict dưới dạng matlab struct
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 Show
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 " 3 cấu trúcPython 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ểnTươ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ắtChú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
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) 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() Đầ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) 4 và p = struct(x=3, y=4) 5 được đặt. Sau đó, giá trị của trường mới p = struct(x=3, y=4) 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) ____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} 1; . Vì vậy, my_dict = {'x':3, 'y':4} 3 và my_dict = {'x':3, 'y':4} 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} 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) Đầ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 = 12my_dict = dict(p)print(my_dict)3Sử dụng toán tử p = struct(x=3, y=4) 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) 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) 3c = a + b 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) 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) 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.y1 và phương pháp {'x': 3, 'y': 4, 'z': 12}1Đô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 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 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) 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) 1 như saufrom ypstruct import *p = struct()2 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}8Phương thức {'x': 3, 'y': 4, 'z': 12} 8 trả về một a = struct(x=1, y=2, z=3) 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 đầu ra sẽ là from ypstruct import *p = struct()4 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)2Có 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) 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) 4. Một mã mẫu saufrom ypstruct import *p = struct()5 Mã này sẽ in ra văn bản này dưới dạng đầu ra from ypstruct import *p = struct()6 Thay vì sử dụng phương thức a = struct(x=1, y=2, z=3) 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) 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 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)8Có 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) 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 Đầu ra sẽ là cái này from ypstruct import *p = struct()9 Tạo bản sao bằng phương pháp c = a + bprint(c)1 và c = a + bprint(c)2struct({'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 5 và c = a + b 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 1 và c = a + b 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 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 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 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 |