Python中通用实现嵌套列表相邻元素成对合并的方法
问题背景
输入为存储十六进制字符串的二维列表my_list,规则为每行内每两个相邻元素(索引0-1、2-3、4-5……)拼接为一个16位有符号整数的十六进制表示,按列对分组输出对应轴的列表。
原输入示例:
my_list = [['61', '00', '7B', '01', 'F2', '1F'], ['9A', 'FE', '8C', '02', '01', '22'], ['F4', 'FD', '60', '04', '35', '24']]
期望输出:
aX = ['6100', '9AFE', 'F4FD'] aY = ['7B01', '8C02', '6004'] aZ = ['F21F', '0122', '3524']
原硬编码实现存在扩展性问题:当列表行长度增加、列对变多时,需要重复新增代码行处理新列对,需要通用可扩展的实现方案。
原硬编码代码:
aX = [ x[0] + x[1] for x in my_list ] aY = [ x[2] + x[3] for x in my_list ] aZ = [ x[4] + x[5] for x in my_list ]
通用实现方法
把「按步长2取列对、按列聚合」的逻辑改成自动遍历,就能适配任意长度的行,不需要每次加新代码。
方法1:简洁遍历实现
核心逻辑是自动计算每行的元素对数量,循环遍历所有列位完成拼接聚合,代码如下:
# 自动计算每行有多少组待拼接的元素对 pair_num = len(my_list[0]) // 2 grouped_result = [] for pair_idx in range(pair_num): # 取所有行中当前组对应的两个元素拼接 current_col = [row[pair_idx*2] + row[pair_idx*2 + 1] for row in my_list] grouped_result.append(current_col) # 按顺序解包即可得到和原逻辑一致的aX/aY/aZ aX, aY, aZ = grouped_result
运行后输出和期望结果完全一致:
print("aX = ", aX) print("aY = ", aY) print("aZ = ", aZ) # 输出: # aX = ['6100', '9AFE', 'F4FD'] # aY = ['7B01', '8C02', '6004'] # aZ = ['F21F', '0122', '3524']
如果后续my_list每行长度增加,比如从6个元素变成8个(共4组元素对),只需要在解包的时候新增对应变量即可,核心聚合逻辑不需要做任何修改:
# 每行8个元素共4组时直接解包 aX, aY, aZ, aW = grouped_result
如果不想单独定义aX/aY这类命名变量,也可以直接通过索引访问结果,比如grouped_result[0]就是原aX的内容,grouped_result[1]对应aY,完全适配任意组数的场景。
方法2:易读性更高的逐行填充写法
如果觉得列表推导式可读性差,可以用逐行遍历填充的写法,逻辑更直白,调试也更方便:
pair_num = len(my_list[0]) // 2 # 初始化和组数对应的空列表容器 res = [[] for _ in range(pair_num)] for row in my_list: for i in range(pair_num): combined_str = row[2*i] + row[2*i + 1] res[i].append(combined_str) aX, aY, aZ = res
说明:以上实现默认输入的
my_list所有行长度一致、且为偶数,符合十六进制数存储场景,如果存在异常行可以提前加长度校验逻辑过滤。
内容的提问来源于stack exchange,提问作者Ramki
相关产品推荐
相关产品推荐

