You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:01:24