Python 3.6中除.append()外,如何实现指定位置插入列表的函数?
解决列表插入并保持结构的问题
首先得指出你当前代码里的几个关键问题——你在函数开头直接给x、y、z重新赋值了,这会完全覆盖掉传入的参数,相当于白传了!比如x = []清空了你要插入的列表,y = [[]]替换了原目标列表,z = 0 or 1直接把z固定成1,这肯定没法实现你要的效果。
先给你一个能满足需求的基础实现,再介绍除了append()之外的其他方法。
正确的基础实现
你要的核心是把列表x作为单个完整元素插入到y的指定位置,Python列表自带的insert()方法刚好能做到这一点——它会把传入的元素原封不动地插到指定索引位置,完全保留结构。
比如按照你的示例需求:
def insertfunc(x, y, z): # 如果你不想修改原列表,就先复制一份;允许修改的话直接操作y即可 y_copy = y.copy() y_copy.insert(z, x) return y_copy # 测试z=0的情况 print(insertfunc(['John', 14], [['Damian', 43], ['Gita', 65]], 0)) # 输出: [['John', 14], ['Damian', 43], ['Gita', 65]] # 测试插在末尾的情况(对应你示例里z=1的效果,原y长度是2,索引2就是末尾) print(insertfunc(['John', 14], [['Damian', 43], ['Gita', 65]], 2)) # 输出: [['Damian', 43], ['Gita', 65], ['John', 14]]
如果你的需求里z=1就是要插在末尾,可以加个小判断调整插入位置:
def insertfunc(x, y, z): y_copy = y.copy() # 当z=1且目标列表不为空时,插在末尾 insert_pos = len(y_copy) if z == 1 and y_copy else z y_copy.insert(insert_pos, x) return y_copy
除了append()之外的实现方式
1. 列表切片拼接(创建新列表)
这种方式会直接生成一个新列表,不会修改原列表,代码也很简洁:
def insertfunc(x, y, z): # 把y切成前z个元素 + [x] + y从z开始的剩余元素 return y[:z] + [x] + y[z:]
测试效果和之前完全一致,而且不需要担心修改原列表的问题。
2. 切片赋值
通过给空切片赋值的方式插入元素,本质和insert()的效果一样:
def insertfunc(x, y, z): y_copy = y.copy() # 把z到z的空切片替换成[x],相当于插入x到z位置 y_copy[z:z] = [x] return y_copy
3. 用extend()实现末尾插入(仅末尾)
如果只是要把x插到y的末尾,y.extend([x])和y.append(x)效果一样,因为extend会把传入的可迭代元素逐个加入,所以把x放到一个列表里传给extend,就能保持x的结构。但这种方式只适合末尾插入,中间插入还是用前面的方法更方便。
原代码问题总结
再帮你梳理下原代码的错误点,避免以后踩坑:
- 不要在函数开头重新赋值传入的参数,否则你传入的实际值就被丢弃了
z = 0 or 1是错误的写法,这行代码的结果永远是1,完全忽略了传入的z值x.append(y)搞反了操作对象,你应该是要把x加到y里,而不是把y加到空的x里- else分支里的
y.insert(i, y)会把y自己插入到每个位置,导致生成无限嵌套的列表,完全不符合需求
内容的提问来源于stack exchange,提问作者FelixF
相关产品推荐
相关产品推荐

