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