【问题标题】:Printing sorted and unsorted list in python在python中打印排序和未排序的列表
【发布时间】:2017-12-15 05:43:27
【问题描述】:

我有一个代码可以生成一个数字列表,然后对其进行排序。排序功能有效,但我需要在排序后打印未排序的列表。这就是为什么我使用 print 函数来打印未排序的,而是打印已排序的列表。我以为我通过将未排序列表分配给变量来存储未排序列表,然后尝试在最后打印它。任何想法为什么它打印排序列表而不是未排序列表?我没有放置 GenerateNumbers() 函数,因为它的作用是给“数字”变量一个未排序数字的列表。我正在使用插入排序。

def InsertionSort(sort_list):
    print("Sorting numbers...")
    for i in range(0, len(sort_list)-1):
       for j in range(i+1,0,-1):
         if(sort_list[j] < sort_list[j-1]):
             temp = sort_list[j-1]
             sort_list[j-1] = sort_list[j]
             sort_list[j] = temp
             print(sort_list)
          else:
             break
    print("Finished sorting.")
    print()
    return sort_list

numbers = GenerateNumbers()
unsorted = numbers
sort_list = numbers

sorted_numbers = InsertionSort(sort_list)
print("unsorted list:", numbers)
print("sorted list:", sorted_numbers)

【问题讨论】:

  • 您的三个变量numbersunsortedsort_list 都指向同一个列表,然后您就地对其进行排序。一种可能性是使用unsorted = numbers[:],它会制作一个副本,而不是将相同的列表分配给unsorted

标签: python list sorting random printing


【解决方案1】:

您的函数对列表进行排序,因此sorted_numbers is sort_list,此外,赋值sort_list = numbers 只是一个重命名,它不会创建新列表,因此sort_list 将与“未排序”“相同” .因此,当您对sort_list 进行排序时,unsorted 也将变为已排序。

你可以通过在数字上调用list来解决这个问题,这将导致python创建一个副本。

numbers = GenerateNumbers()
unsorted = list(numbers)  # creates a copy
sort_list = numbers

sorted_numbers = InsertionSort(sort_list)
print("unsorted list:", numbers)
print("sorted list:", sorted_numbers)

【讨论】:

  • 是的,这就是你所需要的。
【解决方案2】:

你有三个赋值命令

numbers = GenerateNumbers()
unsorted = numbers
sort_list = numbers

您认为您拥有该列表的三个不同副本,但您没有。由于列表是可变类型,Python 为 same 列表创建了三个不同的名称。因此你的困惑。更改其中一个名称的内容会立即更改它们。您需要制作列表的副本。有几种方法可以做到这一点。两种最简单的方法是

numbers = GenerateNumbers()
unsorted = numbers[:]
sort_list = numbers[:]

numbers = GenerateNumbers()
unsorted = list(numbers)
sort_list = list(numbers)

还有其他方法,例如deepcopy(),对更复杂的数据结构很有用,但是这两种方法中的一种就足够了。

【讨论】:

    【解决方案3】:

    当你打电话时

    unsorted = numbers
    sort_list = numbers
    

    您实际上并没有复制列表,您只是复制了对列表的引用。 unsordersort_list 都指向内存中的同一个列表。

    要复制列表,您可以这样做:

    sort_list = list(numbers)
    

    现在 sort_list 指向内存中的一个新列表,您可以在不更改 numbers 的情况下更改 sort_list

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2015-01-04
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多