2016-04-27 3 views
0

Я пытаюсь использовать сортировку вставки для сортировки данных во входном файле, но код не работает! Я чем-то усложняю? Любая помощь будет принята с благодарностью!Использование сортировки вставки для сортировки входных данных

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() 
+2

Что вы подразумеваете под "это не работает"? Что он выводит на какой пример ввода? –

+0

Вы можете заменить входной файл жестко закодированным входом, чтобы мы могли проверить поведение? – Stefano

+0

Это не сортировка вставки. Кажется, больше похоже на какой-то вид пузыря. –

ответ

3

Что вы передаете к insertion_sort является объектный файл. Мне кажется, что ваша функция insertion_sort ожидает чего-то более похожего на список , содержимое которого оно может испортить.

Файловый объект «итерируемый», который (среди прочего) означает, что вы можете сделать список из его содержимого: list(input_file) будет списком с одним элементом в строке в файле. Но обратите внимание, что итерация по строкам - как вы делаете прямо в начале - проходит мимо них, и после распечатки всех строк list(input_file) будет пустым списком. Поэтому, если вы хотите сделать список из файла, вы должны сделать это сразу же после открытия файла.

Изменение списка не изменит содержимое файла. Если вы хотите это сделать, вам нужно будет снова написать его.

0

Просто взглянув на ваш код, я думаю, он ничего не выводит в отсортированном списке по той простой причине, что вы уже исчерпали генератор, возвращающий строки из файла, чтобы распечатать его в несортированном порядке.

Сохраните строки в списке и повторите их, чтобы распечатать его, а затем вы можете повторно использовать список позже для обработки.

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) 
0

Вы можете попробовать что-то вроде этого:

#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» доступен только для чтения.