我有一个我需要解释的数据集,以便重建要分析的信号。为此,我使用了大量的if,elif语句。我想知道是否有更优雅的方式来做到这一点?
这是我的代码:
for line in data:
if line[:2] == '10':
capstart = 1
if capstart == 1:
if line[:2] == 'e3':
reconstruct(int(line[2:6],16), int(line[6:10],16))
elif line[:2] == '02':
if line[8:] == '20':
REDoffset = int(line[2:4],16)
REDledlvl = int(line[4:6],16)
REDgain = int(line[6:8],16)
if line[8:] == '10':
IRoffset = int(line[2:4],16)
IRledlvl = int(line[4:6],16)
IRgain = int(line[6:8],16)
elif line[:2] == '10':
if line[2:4] == '00':
pulse_length_lo = int(line[4:],16)
if line[2:4] == '01':
pulse_length_hi = int(line[4:],16)
if line[2:4] == '02':
pulse_ir_on = int(line[4:],16)
if line[2:4] == '03':
pulse_red_on = int(line[4:],16)
if line[2:4] == '04':
pulse_led_switch_time = int(line[4:],16)
if line[2:4] == '05':
dark_worn_threshold = int(line[4:],16)
if line[2:4] == '06':
imu_accel_range = int(line[4:],16)
if line[2:4] == '07':
imu_gyro_range = int(line[4:],16)
if line[2:4] == '08':
ls_duration = int(line[4:],16)
if line[2:4] == '09':
imu_interval = int(line[4:],16)
if line[2:4] == '0a':
timestamp_lo = int(line[4:],16)
if line[2:4] == '0b':
timestamp_hi = int(line[4:],16)
if line[2:4] == '0c':
ADC_MAX = int(line[4:],16)
if line[2:4] == '0d':
ADC_offset = int(line[4:],16)
if line[2:4] == '0e':
lightsensor_has_red = int(line[4:],16)
if line[2:4] == '0f':
IR_worn_current = int(line[4:],16)
if line[2:4] == '10':
IR_worn_offset = int(line[4:],16)
if line[2:4] == '11':
IR_worn_threshold = int(line[4:],16)
if line[2:4] == '12':
accel_num_bits = int(line[4:],16)
if line[2:4] == '13':
gyro_num_bits = int(line[4:],16)
if line[2:4] == 'ff':
sensor_end_status = line[4:]
else:
other.append(line)
请注意'数据' list包含十六进制数据包,其中fisrt字节(字符串中的前两个字符)表示数据包类型,在每种数据包类型中,我需要分隔字符串并隔离包含在那里的数据。
我可以指出我在哪里看起来会很棒!代码有效,但我希望它更优雅。
答案 0 :(得分:0)
我故意在这里详细说明细节。仅查看依赖于line[2:4]
的变量:
从名为line_2_4_lookup
的词典开始,将输入数字映射到变量名称:
line_2_4_lookup = {
'00': "pulse_length_lo",
'01': "pulse_length_hi",
'02': "pulse_ir_on",
'03': "pulse_red_on",
'04': "pulse_led_switch_time",
'05': "dark_worn_threshold",
'06': "imu_accel_range",
'07': "imu_gyro_range",
'08': "ls_duration",
'09': "imu_interval",
'0a': "timestamp_lo",
'0b': "timestamp_hi",
'0c': "ADC_MAX",
'0d': "ADC_offset",
'0e': "lightsensor_has_red",
'0f': "IR_worn_current",
'10': "IR_worn_offset",
'11': "IR_worn_threshold",
'12': "accel_num_bits",
'13': "gyro_num_bits",
'ff': "sensor_end_status"}
然后,不要使用gyro_num_bits
这样的变量,而是将传入的数字存储在名为input_values
的dict中,因此代替gyro_num_bits
,您的程序需要引用{{1} }}
然后解码只是一行:
input_values["gyro_num_bits"]
答案 1 :(得分:0)
我们可以将它们存储在字典中,而不是为所有这些参数使用数十个单独的命名变量,我将其命名为params
。我将参数名称存储在另一个名为field_names的dict中,并将相关的十六进制代码作为键。
field_names = {
'00': 'pulse_length_lo',
'01': 'pulse_length_hi',
'02': 'pulse_ir_on',
'03': 'pulse_red_on',
'04': 'pulse_led_switch_time',
'05': 'dark_worn_threshold',
'06': 'imu_accel_range',
'07': 'imu_gyro_range',
'08': 'ls_duration',
'09': 'imu_interval',
'0a': 'timestamp_lo',
'0b': 'timestamp_hi',
'0c': 'ADC_MAX',
'0d': 'ADC_offset',
'0e': 'lightsensor_has_red',
'0f': 'IR_worn_current',
'10': 'IR_worn_offset',
'11': 'IR_worn_threshold',
'12': 'accel_num_bits',
'13': 'gyro_num_bits',
'ff': 'sensor_end_status',
}
params = {}
capstart = False
for line in data:
if line[:2] == '10':
capstart = True
if capstart:
if line[:2] == 'e3':
reconstruct(int(line[2:6], 16), int(line[6:10], 16))
elif line[:2] == '02':
if line[8:] == '20':
params['REDoffset'] = int(line[2:4], 16)
params['REDledlvl'] = int(line[4:6], 16)
params['REDgain'] = int(line[6:8], 16)
elif line[8:] == '10':
params['IRoffset'] = int(line[2:4], 16)
params['IRledlvl'] = int(line[4:6], 16)
params['IRgain'] = int(line[6:8], 16)
elif line[:2] == '10':
code = line[2:4]
field = field_names[code]
params[field] = line[4:] if field == 'sensor_end_status' else int(line[4:], 16)
else:
other.append(line)
您尚未向我们提供任何示例数据,因此此代码未经测试,但这应该可以帮助您入门。