【问题标题】:Why are these two arrays the same? [duplicate]为什么这两个数组是一样的? [复制]
【发布时间】:2020-09-17 14:20:08
【问题描述】:

我想要一份我的列表的副本,然后对其进行排序,但由于 python 的工作方式,如果我对列表的副本进行排序,它也会对原始列表进行排序。这是我的代码:

def swapBySoting(arr):
    newArr = arr
    newArr.sort()
    swap = 0
    for i in range(len(arr)):
        if arr[i] != newArr[i]:
            swap +=1
    return int(swap / 2)

我只需要知道如何将副本存储在另一个内存引用中,仅对副本进行排序。谢谢

【问题讨论】:

  • 简短的回答是 newArrarr 仍然指向内存中的同一件事。因此,当您对一个进行排序时,您对两个都进行了排序。这是一个常见的绊脚石,但有很多关于它的文档。
  • 这能回答你的问题吗? List changes unexpectedly after assignment. How do I clone or copy it to prevent this? 如上所述,newArr = arr 不会复制。如果需要副本,则需要显式复制列表。
  • 假设您按照 Carcigenicate 的链接修复了“两个数组都已排序”错误,那么您的函数当前计算错位项目的数量,除以 2。您如何确定该数字等于对数组进行排序所需的最小数量或交换?
  • edit 这个问题有一个描述性的标题,可能类似于“为什么这两个数组相同?” "Can someone help me" is not a real question.

标签: python arrays sorting


【解决方案1】:

分配只是创建一个对象的新别名,它不执行复制。您有两个简单的解决方案:

  1. 分配给第二个时浅复制第一个list

    newArr = arr[:]  # Or arr.copy()
    
  2. 使用内置的sorted 将您的副本和排序合并到一个步骤中(创建一个新的list,对其进行排序,然后返回新的list):

    newArr = sorted(arr)  # No need to call .sort() afterwards
    

旁注:为了比较元素,循环索引相对较慢且不符合 Python 标准。使用zip 并解压缩为有用的名称会变得更好(而且速度更快):

for old, new in zip(arr, newArr):
    if old != new:
        swap +=1

也就是说,这种计算最小交换次数的算法几乎肯定是错误的,但这完全是另一个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多