Python for循环中index()方法的使用疑问及相关代码解析
代码作用解析
核心语句 number_sets.index(number_set) 的作用
你对index()方法的理解是正确的,它会返回列表中指定元素首次出现的索引值。这段代码里使用它的目的是定位当前遍历到的子列表在原始嵌套列表中的位置,从而把平方后的数值存入新列表对应的位置。
整体循环逻辑拆解
我们逐行梳理运行流程:
- 首先定义原始嵌套列表
number_sets = [[2, 4, 6], [3, 6, 9], [4, 8, 12]],以及空列表square_sets用来存储平方后的结果。 - 外层for循环每次遍历拿到
number_sets里的一个子列表:- 先给
square_sets追加一个空列表,用来存储当前子列表元素的平方值 - 内层循环遍历子列表里的每个数字:
- 计算平方后,用
number_sets.index(number_set)拿到当前子列表在原始列表的下标,找到square_sets里相同下标的空列表,把平方值追加进去
- 计算平方后,用
- 先给
举实际运行的例子说明:
- 第一次外层循环拿到的子列表是
[2,4,6],index()返回值为0,对应square_sets里刚添加的第一个空列表,把4、16、36依次存入 - 第二次外层循环拿到的子列表是
[3,6,9],index()返回值为1,对应square_sets里的第二个空列表,把9、36、81依次存入 - 第三次外层循环拿到的子列表是
[4,8,12],index()返回值为2,对应square_sets里的第三个空列表,把16、64、144依次存入
最终打印的square_sets结果为:[[4, 16, 36], [9, 36, 81], [16, 64, 144]]
该写法的问题&优化方案
这个写法存在两个明显缺陷:
- 效率低:每次内层循环都要调用一次
index()遍历原始列表查找下标,数据量大的时候性能损耗非常明显 - 容错性差:如果原始列表里有重复的子列表,
index()只会返回第一个匹配的下标,会导致数据存储位置错误。比如number_sets = [[2,4,6], [2,4,6], [3,6,9]]的场景下,第二个[2,4,6]的平方值也会被存入第一个子列表中。
更推荐使用enumerate直接在外层循环获取下标,不需要额外调用index():
number_sets = [[2, 4, 6], [3, 6, 9], [4, 8, 12]] square_sets = [] for idx, number_set in enumerate(number_sets): square_sets.append([]) for number in number_set: print("The original number is %d, and the result is %d." % (number, number ** 2)) square_sets[idx].append(number ** 2) print(square_sets)
内容的提问来源于stack exchange,提问作者junji
相关产品推荐
相关产品推荐

