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

如何更新存储完全平方数的list2并从list1移除对应数?当前仅输出[0]

问题原因与解决方案

问题根源

你遇到的问题是遍历列表的同时修改原列表导致的。具体过程:

  • 初始list1 = [0,1],循环按初始索引0、1依次访问元素。
  • 第一次循环取到0,满足条件加入list2,随后从list1中移除0,此时list1变为[1]。
  • 第二次循环要访问索引1的元素,但list1长度已变为1,索引1不存在,循环直接终止,1从未被检查。

解决方案

方法1:遍历原列表的副本

遍历列表的副本,修改原列表不会影响循环的迭代顺序:

import math
def perfectSquare(num):
    return math.ceil(math.sqrt(num)) == math.floor(math.sqrt(num))

list1 = [0,1]
list2 = [] 
# 遍历list1的副本,避免修改原列表影响循环
for i in list1.copy():
    if perfectSquare(i):
        list2.append(i)
        list1.remove(i)
print(list2)  # 输出 [0,1]

方法2:反向遍历列表

反向遍历的时候,删除前面的元素不会干扰后续迭代:

import math
def perfectSquare(num):
    return math.ceil(math.sqrt(num)) == math.floor(math.sqrt(num))

list1 = [0,1]
list2 = [] 
# 从后往前遍历
for i in reversed(list1):
    if perfectSquare(i):
        list2.append(i)
        list1.remove(i)
# 若需要保持原顺序,反转list2即可
list2.reverse()
print(list2)  # 输出 [0,1]

方法3:列表推导式(推荐)

用列表推导式直接分离两个列表,逻辑清晰且无遍历修改问题:

import math
def perfectSquare(num):
    return math.ceil(math.sqrt(num)) == math.floor(math.sqrt(num))

list1 = [0,1]
# 筛选完全平方数到list2
list2 = [num for num in list1 if perfectSquare(num)]
# 剩下的元素重新赋值给list1
list1 = [num for num in list1 if not perfectSquare(num)]
print(list2)  # 输出 [0,1]
print(list1)  # 输出 []

额外优化:更可靠的完全平方数判断

原判断方法可能存在浮点数精度问题(比如大数场景),可以用Python 3.8+支持的math.isqrt来优化:

def perfectSquare(num):
    if num < 0:
        return False
    root = math.isqrt(num)  # 返回整数平方根
    return root * root == num

内容的提问来源于stack exchange,提问作者Jasleen Kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:10:48