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

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

  1. 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;
  2. 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 đó;
  3. 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;
  4. 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 đặt

Cá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ản

Kiể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
1

Cách sử dụng đơn giản của

struct[{'x': 3, 'y': 4, 'A': 12}]
7 được đưa ra trong khối mã sau

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[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 ra

Trong đ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 nhau

Ngoà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ư sau

my_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ức

Lớ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ày

Cá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ày

Kế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

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ư sau

a = 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]
3

c = 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ạng

Cá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

Đô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ẫu

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
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[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
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ệu

Thay 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ư sau

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
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}
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 sau

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
3

đầu ra sẽ là

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
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úc

Thê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

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 sau

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
5

Mã này sẽ in ra văn bản này dưới dạng đầu ra

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
6

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ày

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
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]
8

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 đây

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
8

Đầu ra sẽ là cái này

from ypstruct import *p = struct[]
p.x = 3
p.y = 5
p.A = p.x * p.y
print[p]
9

Tạo bản sao bằng phương pháp
c = a + b
print[c]
1 và
c = a + b
print[c]
2

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úc

struct[{'x': 3, 'y': 4, 'A': 12}]
0

Bâ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úc

Cách chính xác để tạo một bản sao của p như sau

struct[{'x': 3, 'y': 4, 'A': 12}]
2

Lầ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]
5

Phần kết luận

Sử 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úc

Trướ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

Chủ Đề