循环修改列表元素时如何保持列表尺寸不变?
保持列表尺寸不变的修改方案
你的代码问题出在直接替换了整个子列表:原列表li是三维嵌套结构,每个li[i][0]都是一个[0,0]的子列表,但你在循环里把它赋值为整数i,直接破坏了原有的层级结构,导致列表尺寸和嵌套逻辑发生变化,后续访问li[0][0][0]时自然会报错(因为li[0][0]已经变成整数,无法再进行索引)。
要保持列表尺寸和结构不变,你需要修改子列表内部的元素,而非替换整个子列表。根据你的需求(第0列、行i对应的内容更新),有两种常见修改方式:
方式1:修改子列表的单个元素
如果只想把第i行第0列的子列表第一个元素设为i,保留第二个元素不变:
str0 = "Hi" str1 = "Bye" li = [[[0, 0] for y in range(len(str1)+1)] for x in range(len(str0)+1)] print(li) # 输出:[[[0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0]]] print(li[0][0][0]) # 输出:0 for i in range(0, len(str0) + 1): li[i][0][0] = i # 仅修改子列表的第一个元素 print(li) # 输出:[[[0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0]], [[2, 0], [0, 0], [0, 0], [0, 0]]] print(li[0][0][0]) # 输出:0
方式2:替换为同结构的子列表
如果需要把第i行第0列的子列表整体替换为新的同长度列表(比如[i, 0]):
str0 = "Hi" str1 = "Bye" li = [[[0, 0] for y in range(len(str1)+1)] for x in range(len(str0)+1)] print(li) # 输出:[[[0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0]]] print(li[0][0][0]) # 输出:0 for i in range(0, len(str0) + 1): li[i][0] = [i, 0] # 替换为同结构的子列表 print(li) # 输出:[[[0, 0], [0, 0], [0, 0], [0, 0]], [[1, 0], [0, 0], [0, 0], [0, 0]], [[2, 0], [0, 0], [0, 0], [0, 0]]] print(li[0][0][0]) # 输出:0
两种方式都能保持原列表的三维结构和尺寸,后续访问嵌套元素时不会报错。
内容的提问来源于stack exchange,提问作者Janne
相关产品推荐
相关产品推荐

