Python列表首尾交错排列算法实现异常求助
问题原因分析
原代码的问题主要出在两个地方:
- 循环次数错误:原列表长度为8,你循环了8次,但实际上交替取首尾只需要4次操作(每轮取两个元素),多出来的循环会对已经调整好的元素重复操作,导致顺序混乱。
- 插入位置计算错误:当
i=0时,2*i-1等于-1,Python中列表的insert(-1, x)是把元素插入到倒数第二个位置,而非你预期的第二个位置(索引1)。后续循环中,随着列表元素被插入、弹出,原有的索引逻辑完全被打乱,最终导致7和8的位置颠倒。
正确实现方案
这里提供几种简洁可靠的实现方式:
方案1:双指针法(高效,不修改原列表)
用两个指针分别指向列表的开头和结尾,交替取元素,直到指针交叉:
lista = [1, 2, 3, 4, 5, 6, 7, 8] result = [] left = 0 right = len(lista) - 1 while left <= right: if left == right: # 处理奇数长度的情况,避免重复添加 result.append(lista[left]) else: result.append(lista[left]) result.append(lista[right]) left += 1 right -= 1 print("The list after shift is :", result)
输出:The list after shift is : [1, 8, 2, 7, 3, 6, 4, 5]
方案2:弹出首尾元素构建新列表(直观,会修改原列表)
直接从原列表的首尾弹出元素,添加到新列表,直到原列表为空:
lista = [1, 2, 3, 4, 5, 6, 7, 8] result = [] while lista: result.append(lista.pop(0)) # 弹出第一个元素 if lista: # 列表不为空时再弹出最后一个 result.append(lista.pop()) print("The list after shift is :", result)
输出和预期一致,注意pop(0)对于大列表效率较低,因为列表是线性结构,弹出开头元素会移动所有后续元素。
方案3:切片+zip配对(简洁,Pythonic写法)
把列表分成前半部分和反转后的后半部分,配对后展开:
lista = [1, 2, 3, 4, 5, 6, 7, 8] half = (len(lista) + 1) // 2 # 前半部分和反转后的后半部分配对 pairs = zip(lista[:half], lista[::-1][:half]) # 展开配对结果 result = [] for a, b in pairs: result.append(a) if a != b: # 处理奇数长度的情况 result.append(b) print("The list after shift is :", result)
这种写法更简洁,适合熟悉Python切片和zip的场景。
内容的提问来源于stack exchange,提问作者Manuel Deza
相关产品推荐
相关产品推荐

