提示在python中解析一个大的列表

时间:2018-01-08 13:38:39

标签: python

我有一个我需要解释的数据集,以便重建要分析的信号。为此,我使用了大量的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字节(字符串中的前两个字符)表示数据包类型,在每种数据包类型中,我需要分隔字符串并隔离包含在那里的数据。

我可以指出我在哪里看起来会很棒!代码有效,但我希望它更优雅。

2 个答案:

答案 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)

您尚未向我们提供任何示例数据,因此此代码未经测试,但这应该可以帮助您入门。