【问题标题】:Using insertion sort to sort input data [closed]使用插入排序对输入数据进行排序[关闭]
【发布时间】:2016-04-27 11:15:52
【问题描述】:

我正在尝试使用插入排序对输入文件中的数据进行排序,但代码似乎不起作用!我是不是太复杂了?任何帮助将不胜感激!

input_file = open('C:\\Users\\Desktop\\data.txt', 'r') 
for line in input_file:
    print line

def insertion_sort(items):
    for i in range (1, len(items)):
        j=i
        while j>0 and items[j]<items [j-1]:
            temp = items[j]
            items [j]=items[j-1]
            items [j-1]=temp
            j=j-1

insertion_sort(input_file)
print 'After sorting:', input_file

input_file.close()

【问题讨论】:

  • “它不起作用”是什么意思?它在什么示例输入上输出什么?
  • 你能用硬编码的输入替换输入文件,以便我们测试行为吗?
  • 这不是插入排序。看起来更像是某种冒泡排序。
  • 而且您似乎将 File 对象作为该函数的输入,而后者试图更改它。我怀疑这是一个可以接受的操作。
  • 也许你需要写回文件。

标签: python python-2.7 insertion-sort


【解决方案1】:

您传递给insertion_sort 的是一个文件对象。在我看来,您的 insertion_sort 函数需要的东西更像是一个 list,它的内容可能会被弄乱。

文件对象是“可迭代的”,这(除其他外)意味着您可以从其内容中创建一个列表:list(input_file) 将是一个列表,文件中的每一行都有一个元素。但请注意,遍历这些行——就像你在开始时所做的那样——会越过它们,在打印出所有行之后 list(input_file) 将是一个空列表。所以如果你想从文件中列出一个列表,你应该在打开文件后立即进行。

更改列表不会更改文件的内容。如果你想这样做,你需要重新写出来。

【讨论】:

    【解决方案2】:

    仅查看您的代码,我猜它不会在排序列表中输出任何内容,原因很简单,因为您已经用尽了生成器从文件返回的行以未排序的顺序打印它。

    将这些行存储在一个列表中并对其进行迭代以打印它,然后您仍然可以稍后重复使用该列表进行处理。

    input_file = open('C:\\Users\\Desktop\\data.txt', 'r') 
    input_lines = input_file.readlines()
    
    for line in input_lines:
        print line
    
    insertion_sort(input_lines)
    

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

      #use 'with' statement so context manager will handle possible exceptions and close file
      with open('C:\\Users\\Desktop\\data.txt', 'r'):
          def insertion_sort(sort_list):
              for i in range(0, len(sort_list)):
                  j = i
                  while j > 0 and sort_list[j - 1] < sort_list[j]:
                      #some sugar to avoid temp variable
                      sort_list[j - 1], sort_list[j] = sort_list[j], sort_list[j - 1]
                      j = j - 1
      
          #make a list of file iterator
          list_to_sort = list(input_file)
          print 'Before:', list_to_sort
          insertion_sort(list_to_sort)
          print 'After:', list_to_sort
      

      正如上面的答案中提到的,当您打开文件时,您会得到一个迭代器。如果你想要一个你可以玩的对象(修改它的内容),当然你可以列出这个迭代器。当您以只读模式打开文件时,您无法在其中写入我们函数的结果。如果您需要将结果写回文件,您应该以“r+”模式打开它,因为“r”是只读的。

      【讨论】:

        猜你喜欢
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多