Python for循环索引传递方法及代码缩进错误排查求助
解决你的Python缩进错误与for循环索引传递问题
一、先搞定你的缩进错误
你碰到的unindent does not match any outer indentation level错误,核心原因是代码块缩进不统一——要么是混用了空格和制表符,要么是同一层级的缩进空格数不一样。我帮你梳理了代码里的关键问题:
1. grouped函数里的致命问题
- 变量名大小写混乱:你定义的循环变量是小写
k,自增时却写成了大写K+=1,这不仅会触发未定义错误,还因为缩进位置不对(应该和if/else同级,属于while循环体的一部分) - 错误返回了函数内未定义的
list1,应该返回你创建的list3 - 循环条件
while k<3不符合你的cluster长度(你的cluster有6个元素),要改成while k < len(cluster)才能遍历所有聚类
修正后的grouped函数:
def grouped(variable, cluster=[]): k = 0 while k < len(cluster): if variable in cluster[k]: return [1, k] # 返回标记和聚类索引,符合你说的"索引对应list[1],聚类中的索引变量为(2)" k += 1 return [0, -1]
2. 全局代码的缩进统一
检查主循环里的所有代码块,确保同一层级的代码都用相同数量的空格(比如4个),绝对不要混合制表符和空格。比如while j < len(list1)内部的代码,每一层缩进都要对齐。
二、Python for循环中传递索引的3种常用方法
如果你想在for循环里拿到循环索引(不只是遍历元素),这几种方法最实用:
1. 使用enumerate()(最推荐)
enumerate()会同时返回索引和对应元素,语法简洁可读性拉满:
list1 = [10,11,30,40,70,80] for index, num in enumerate(list1): print(f"索引{index}对应的元素是{num}") # 这里直接用index就能做你需要的索引操作
2. 使用range(len(列表))
如果只需要索引,或者要通过索引访问元素,可以用这种方式:
list1 = [10,11,30,40,70,80] for index in range(len(list1)): num = list1[index] print(f"索引{index}对应的元素是{num}")
3. 手动维护索引变量(适合while循环)
就像你代码里用的while循环,可以手动定义索引变量,每次循环后自增:
list1 = [10,11,30,40,70,80] index = 0 while index < len(list1): num = list1[index] print(f"索引{index}对应的元素是{num}") index += 1
三、结合你的需求优化后的完整代码
根据你描述的“提取数字最后两位、按cluster逻辑归入聚类”的需求,我把主循环的while替换成了更简洁的for+enumerate,同时修复了所有缩进和逻辑问题:
def find_min(matrix=[]): i, j = 0, 0 min1 = [1000, 0, 0] while i < len(matrix): while j < len(matrix[i]): # 修正为每行的长度,避免非方阵报错 if matrix[i][j] != 0 and matrix[i][j] is not None: if min1[0] > matrix[i][j]: min1[0] = matrix[i][j] min1[1] = i min1[2] = j j += 1 j = 0 i += 1 return min1[1:] def check_min(variable, list2=[]): min_val = 1000 for num in list2: diff = abs(variable - num) if diff < min_val: min_val = diff return min_val def grouped(variable, cluster=[]): for k in range(len(cluster)): if variable in cluster[k]: return [1, k] return [0, -1] list1 = [10,11,30,40,70,80] cluster = [[0,1],[10,11],[2,3],[30,40],[],[]] w, h = len(list1), len(list1) matrix = [[None for x in range(w)] for y in range(h)] # 用for+enumerate替代while,更清晰 for i, num_i in enumerate(list1): for j, num_j in enumerate(list1): # 获取i的聚类信息 temp_i = grouped(num_i, cluster) # 这里应该传递数字本身,而非索引,符合你"提取最后两位归聚类"的需求 index_i, cluster_idx_i = temp_i[0], temp_i[1] # 获取j的聚类信息 temp_j = grouped(num_j, cluster) index_j, cluster_idx_j = temp_j[0], temp_j[1] if i > j: matrix[i][j] = 0 elif index_i == 1 and index_j == 1: matrix[i][j] = 0 elif index_i == 1 and index_j == 0: matrix[i][j] = check_min(num_j, cluster[cluster_idx_i]) elif index_i == 0 and index_j == 0: matrix[i][j] = abs(num_i - num_j) # 打印验证结果 for row in matrix: print(row)
额外优化:我简化了check_min的逻辑,用abs直接计算绝对值;修正了find_min中遍历矩阵的潜在问题;还调整了grouped的参数传递(应该传入数字而非索引,符合你提取最后两位归聚类的需求)。
内容的提问来源于stack exchange,提问作者sajjad zargar




