python - 使用下面代码中的 "i-=smallest"语句,我打算更改原始数组 arr,但这并没有发生。我该怎么办?

标签 python arrays python-3.x

代码如下:

n = int(input())
arr = input().split()
arr = [int(x) for x in arr]
smallest = 1001
while(True):
    if smallest==0:
        break
    arr.sort()
    count = 0
    smallest = arr[0]
    for i in arr:
        if i==0:
            arr.remove(i)
        i-=smallest           #This statement.
        count+=1
    print(count)

对于输入: (n=)6 和 (arr=)5 4 4 2 2 8 我得到的输出是: 6 6 6... 然而,根据我的说法,如果我的逻辑有效(并且上述语句实际上编辑了我的原始数组元素),那么输出应该是 6 4 2 1 相反。

我可能把整个事情搞错了。我是业余爱好者。感谢任何形式的帮助。

最佳答案

让我们看看内部循环

for i in arr:
    if i==0:
        arr.remove(i)
    i-=smallest
    count+=1

它将arr中的第一个值分配给i。由于数组的值都不为零,因此它不会从列表中删除任何内容。

然后它通过减去最小值来重新分配 i 的值。第一次通过循环时,它将零值分配给 i。然后它增加计数。列表arr 未更改。 i=-smallest 行无效,因为 i 被重新分配给列表的下一个值。

因此,对于值 5 4 4 2 8 8(其中都不为零),该循环相当于

for i in arr:
    count+=1

这就是为什么它总是打印 6。我不确定为什么你认为它应该打印 6 4 2 1。我怀疑你认为列表正在被更改,但是行 if i==0 始终为 false。

更改 for 循环中迭代的对象肯定会让您感到困惑。几乎肯定有更好的方法来实现您想要的。例如,参见Remove items from a list while iterating

关于python - 使用下面代码中的 "i-=smallest"语句,我打算更改原始数组 arr,但这并没有发生。我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39667130/

相关文章:

python - 如何使用 Beautiful Soup 提取 <script> 标签中的字符串?

Python lxml - 返回空列表

Python:将维度附加到二维数组

python-3.x - 列表列表中的Python 3列表理解以转换类型

python-3.x - 完整 Jupyter Notebook 的性能分析

python - 删除谷歌驱动器文件时权限不足错误

python - 是否可以使用 make_blobs 定义中心坐标?

arrays - 使用 Javascript/Node JS 从数组中删除单引号

arrays - 未排序数组二分查找的时间复杂度

python - 可以用mock_open来模拟串口连接吗?