如何更新存储完全平方数的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
相关产品推荐
相关产品推荐

