2016-02-27 3 views
0

Я новичок в Python, и я борюсь с сортировкой чисел в файле. Я хочу сделать пузырь или сортировку вставки и упорядочить числа в файле в порядке возрастания. Числа не являются целыми числами. Это то, что я до сих пор:Сортировка файла в Python

input_file=open("C:\\Users\\Rachel\\Documents\\Natural Sciences MSci\\Year 2\\Env Sci\\Comp Modelling\\Pptn data.txt", "r") 
header_line = input_file.readline() 
for line in input_file: 
print line 

list=input_file.read() 
print list 

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(list) 
print 'After sorting:', list 

После того как я запускаю это, печатается несортированный список и фразы After sorting: появляется, но без отсортированного списка чисел: D

Я уверен, что я отсутствует что-то очевидное, но я пробовал множество разных способов и, похоже, не понял.

Любая помощь будет замечательной Спасибо!

+0

Также обратите внимание, что вы, вероятно, захотите использовать file.readlines() вместо file.read(), чтобы прочитать строки файла в списке. –

+0

Вам придется разделить 'while j> 0 и элементы [j] Elan

ответ

0

Извините за путаницу с вашей целью. Вот правильный код:

input_file=open("C:\\Users\\Rachel\\Documents\\Natural Sciences MSci\\Year 2\\Env Sci\\Comp Modelling\\Pptn data.txt", "r") 
header_line = input_file.readline() 

list=input_file.read().split() 


def insertion_sort(items): 
    for i in range(1, len(items)): 
     j = list[i] 
     i = i - 1 
     while i >= 0: 
      if j < list[i]: 
       list[i + 1] = list[i] 
       list[i] = j 
       i = i - 1 
      else: 
       break 


insertion_sort(list) 
print 'After sorting:', list 
1

Одна проблема заключается в том, что начальный цикл исчерпывает данные из входного файла, так что нет ничего не осталось, чтобы прочитать в последующем input_file.read(). Также read() вернет строку, а не список. Но в любом случае ваша функция сортировки вставки работает на пустой строке, поэтому она ничего не делает.

Вы можете исправить первую проблему, обратившись к началу файла после цикла for. Вторая проблема может быть исправлена ​​путем разделения входа с помощью линий, используя splitlines():

header_line = next(input_file) 
for line in input_file: 
    print line 

input_file.seek(0) 
next(input-file) # skip header again 
list=input_file.read().splitlines() 
print list 

Но это, вероятно, лучше всего сделать это:

with open('input_file') as input_file: 
    header_line = next(input_file).strip() 
    numbers = [line.strip() for line in input_file] 
    # if you really want to print them out first... 
    for number in numbers: 
     print number 

    insertion_sort(numbers) 

нотабене этот код не преобразует данные из файла в любой числовой тип (например, целое число), потому что вы сказали, что числа не являются целыми числами ... так что это такое? Не преобразование в числовой тип означает, что ваша функция сортировки будет сортироваться на основе последовательности сортировки ASCII числовых строк, поэтому '10' будет сортировать до '2'.

Если число может быть поплавки, вы можете сделать это при чтении файла:

numbers = [float(line) for line in input_file] 

теперь ваша функция сортировки будет сортировать числа, такие как 1 или 1,0, как поплавки.

0

Ваш алгоритм работает нормально. Я попробовал следующее на своем компьютере. Я создал файл с именем numbers.txt и поместил номера следующим образом:

23 
23.4 
4 
5 
6.7 
1 
0 
6 
34 

И побежал следующий код:

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 

numbers = open("numbers.txt").read().split() 
numbers = [float(number) for number in numbers] 
print "Before sorting: ", numbers 
insertion_sort(numbers) 
print "After sorting: ", numbers 

Который дал мне следующий вывод:

Before sorting: [23.0, 23.4, 4.0, 5.0, 6.7, 1.0, 0.0, 6.0, 34.0] 
After sorting: [0.0, 1.0, 4.0, 5.0, 6.0, 6.7, 23.0, 23.4, 34.0] 

Надеюсь, это поможет.

+0

Проблема заключается не в алгоритме сортировки, а в коде, который читает файл. – mhawke

+0

@mhawke Да, точно моя точка. –

+0

@ mhawke О, я не понимал, что вы уже опубликовали то же самое. Не обновил страницу. Извини за это. –

Смежные вопросы