鱼C论坛

 找回密码
 立即注册
查看: 1606|回复: 1

[已解决]删除列表中的最大元素和最小元素

[复制链接]
发表于 2023-6-4 19:44:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

读入一个整数列表,输出删除最大元素和最小元素后的列表。最大元素和最小元素可能有多个。
【输入形式】

输入列表,包括方括号
【输出形式】

直接用print输出列表
【样例输入】

[1,2,3,4,5,6,1,7,7]
【样例输出】

[2, 3, 4, 5, 6]

<nums=eval(input())
a=max(nums)
b=min(nums)
nums1=nums.copy()
for x in nums:
    if x==a or x==b:
        nums1.remove(x)
print(nums1)>

<nums=eval(input())
a=max(nums)
b=min(nums)
for x in nums:
    if x==a or x==b:
        nums.remove(x)
print(nums)>

我想知道为什么第一个代码是对的,第二个是错的,什么时候需要用copy函数
最佳答案
2023-6-4 19:50:34
问题出现在第二个代码中的循环内部对列表的操作上。因为在循环中删除元素会改变列表的长度,从而导致后面的元素下标被改变,进而产生错误的结果。比如,在 nums=[1,2,3,4,5,6,1,7,7] 的情况下,当执行到下标为 6 的元素 1 时,1 是最小值之一,会被删除,此时列表变为 [2, 3, 4, 5, 6, 7, 7],但是下标要移动到 7。而在此时循环变量 x 的下一个循环中,x 的值是 7,但是因为下标错位,实际上刚才的最后一个元素没有被检查,从而无法正确删除。

为了避免这种问题,可以使用 copy() 函数来创建一个列表的副本,遍历副本时进行删除操作,然后返回修改后的原始列表。这样做的好处是保留原始列表的不变性,避免因修改导致的后续错误。

此外,有些 Python 版本(比如 Python 2.x)中,如果在循环中删除元素时,同时将下标作为循环变量,则会出现无法正常删除的问题。在这种情况下,也需要使用 copy() 来避免问题。

下面是一个修改后的代码,可供参考:
nums = eval(input())
max_val = max(nums)
min_val = min(nums)
nums_copy = nums.copy()
for x in nums_copy:
    if x == max_val or x == min_val:
        nums.remove(x)
print(nums)
在上述代码中,我们创建了一个 nums_copy 的副本,并遍历这个副本来删除元素,最后返回修改后的 nums,保留了原始列表的不变性。

而其他版本的代码则有不同的实现方式,因此也出现了结果上的差异。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 19:50:34 | 显示全部楼层    本楼为最佳答案   
问题出现在第二个代码中的循环内部对列表的操作上。因为在循环中删除元素会改变列表的长度,从而导致后面的元素下标被改变,进而产生错误的结果。比如,在 nums=[1,2,3,4,5,6,1,7,7] 的情况下,当执行到下标为 6 的元素 1 时,1 是最小值之一,会被删除,此时列表变为 [2, 3, 4, 5, 6, 7, 7],但是下标要移动到 7。而在此时循环变量 x 的下一个循环中,x 的值是 7,但是因为下标错位,实际上刚才的最后一个元素没有被检查,从而无法正确删除。

为了避免这种问题,可以使用 copy() 函数来创建一个列表的副本,遍历副本时进行删除操作,然后返回修改后的原始列表。这样做的好处是保留原始列表的不变性,避免因修改导致的后续错误。

此外,有些 Python 版本(比如 Python 2.x)中,如果在循环中删除元素时,同时将下标作为循环变量,则会出现无法正常删除的问题。在这种情况下,也需要使用 copy() 来避免问题。

下面是一个修改后的代码,可供参考:
nums = eval(input())
max_val = max(nums)
min_val = min(nums)
nums_copy = nums.copy()
for x in nums_copy:
    if x == max_val or x == min_val:
        nums.remove(x)
print(nums)
在上述代码中,我们创建了一个 nums_copy 的副本,并遍历这个副本来删除元素,最后返回修改后的 nums,保留了原始列表的不变性。

而其他版本的代码则有不同的实现方式,因此也出现了结果上的差异。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表