求助:使用for循环优化多组重复数组运算代码
求助:使用for循环优化多组重复数组运算代码
嘿,我来帮你搞定这个重复代码的优化问题!看你现在是硬编码生成u1/u2/v1/v2各自的三个数组,确实可以用循环来大幅简化,不用重复写四次逻辑。
首先咱们先拆解每个数组的生成规律,这样才能把逻辑抽象成循环:
1. 先分析三个数组的规律
假设你的数组索引是1-based(从1开始计数,和你写的代码一致):
- delta_X_up_down(X代表u1/u2/v1/v2):取数组中每一对相邻的偶数索引减奇数索引,也就是
X[2] - X[1], X[4]-X[3], ..., X[18]-X[17],总共9个元素,对应k从1到9,每一组是X[2k] - X[2k-1]。 - delta_X_first:分为两部分,前半是奇数索引1、3、...、15分别减去X[17](共8个元素),后半是偶数索引2、4、...、16分别减去X[18](共8个元素),总共16个元素。
- delta_X_previous:同样分两部分,前半是奇数索引1→3、3→5、...、15→17的差值(
X[2k-1] - X[2k+1],k从1到8),后半是偶数索引2→4、4→6、...、16→18的差值(X[2k] - X[2k+2],k从1到8),总共16个元素。
2. 用循环实现的代码示例
我们可以把要处理的四个数组放到一个字典里,然后循环遍历每个数组,同时用字典来存储每个数组对应的三个结果,这样代码会非常简洁:
# 假设你已经有了u1, u2, v1, v2这四个数组(注意索引要对应1-based,或者如果是Python的0-based要调整) # 先把要处理的数组放到一个字典里,方便后续对应命名 target_arrays = { 'u1': u1, 'u2': u2, 'v1': v1, 'v2': v2 } # 用来存储所有结果的字典 results = {} for name, arr in target_arrays.items(): # 生成delta_X_up_down delta_up_down = [arr[2*k] - arr[2*k -1] for k in range(1, 10)] # k从1到9,对应2-1到18-17 # 生成delta_X_first delta_first = [] # 前半部分:奇数索引1,3,...,15 减 arr[17] for i in range(1, 16, 2): delta_first.append(arr[i] - arr[17]) # 后半部分:偶数索引2,4,...,16 减 arr[18] for i in range(2, 17, 2): delta_first.append(arr[i] - arr[18]) # 生成delta_X_previous delta_previous = [] # 前半部分:奇数索引相邻后一个减前一个(1→3, 3→5...15→17) for i in range(1, 16, 2): delta_previous.append(arr[i] - arr[i+2]) # 后半部分:偶数索引相邻后一个减前一个(2→4,4→6...16→18) for i in range(2, 17, 2): delta_previous.append(arr[i] - arr[i+2]) # 把当前数组的三个结果存入results字典 results[f'delta_{name}_up_down'] = delta_up_down results[f'delta_{name}_first'] = delta_first results[f'delta_{name}_previous'] = delta_previous # 之后你就可以通过results来获取对应的数组,比如results['delta_u1_up_down']
3. 补充说明
如果你的数组是Python默认的0-based索引(从0开始计数),那需要把上面的索引都减1调整一下,比如原来的arr[1]要改成arr[0],arr[17]改成arr[16],以此类推,逻辑是完全一致的。
这样一来,不管你后续要加更多类似的数组,只需要在target_arrays里添加键值对就行,不用重复写三次数组生成的代码啦~
备注:内容来源于stack exchange,提问作者TFAE
相关产品推荐
相关产品推荐

