2019年1月22日 星期二

[python] 最簡單的方式宣告二維 list: 即一個 list 內容是一堆 list?



這種問題常見於如何宣告一個二維 list, 裡面放多個 channel 的資料
例如:
binary file  = [ch1 data 3 byte] [ch2 data 3 byte] [ch3 data 3 byte], .....
data[0] = [ch1 data]
data[1] = [ch2 data]
data[2] = [ch3 data]

關鍵片段
1. data_3xn = [  [][][]  ]
2. data_rowxcol = [[] for y in range(row)]

作法
要宣告一個二維 list, 首先要先配置外面的 list 內容為一個一個 list
例如:
#    [] ----> [.......]
#    [] ----> [.......]
#    [] ----> [.......]
data_3xn = [  [], [], []  ]

data_3xn[0].append (填入資料到 channel 0)
data_3xn[1].append (填入資料到 channel 1)
data_3xn[2].append (填入資料到 channel 2)

如果 row 是變數, 那就用 for-range
#    [] ----> [.......]
#    [] ----> [.......]
#    [] ----> [.......]
#    ...
data_rowxcol = [[] for y in range(row)]
data_rowxcol[0].append (填入資料到 channel 0)
data_rowxcol[1].append (填入資料到 channel 1)
data_rowxcol[2].append (填入資料到 channel 2)

使用情境: 一個二維 list, 裡面放多個 channel 的資料
'''
binary file  = [ch1 data 3 byte] [ch2 data 3 byte] [ch3 data 3 byte]
data[0] = [ch1 data]
data[1] = [ch2 data]
data[2] = [ch3 data]
'''
def get_data_multi_channel(filename, row_num, size_data_in_byte=3, byteorder='big'):
    # Get data from binary file  = [ch1 data 3 byte] [ch2 data 3 byte] [ch3 data 3 byte]
    # Return
    #    data
    #    [] ---> [.......]
    #    [] ---->[.......]
 
    data_rowxcol = [[] for y in range(row_num)]
    with open(filename, "rb") as f:
        bRun = True
        while bRun:
            for i in range(0, row_num):
                data = f.read(size_data_in_byte)
                if not data:
                    bRun = False
                    break;
                data_rowxcol[i].append(int.from_bytes(data, byteorder, signed=True))
    return data_rowxcol

def test_get_data_multi_channel():
    data_ecg_3xn = get_data_multi_channel(fullfilename, 3)
    print('data_ecg_3xn = ', data_ecg_3xn)


Enjoy!
by Jing.

Reference