2016-04-27 2 views
-2
def insertionSort(a): 
    for i in range(1, len(a)): #outer loop covering the range 
     value = a[i] #value = to list, which will compare items to the left 
     i = i - 1 #i goes lower than index to compare further to the left 
     while i >= 0 : #keep comparing till its at the beginning of the list 
      if value < a[i]: #if value is less than i 
       a[i+1] = a[i] # shift number in right i to slot i + 1 
       a[i] = value # shift value that was left into slot i 
       i = i - 1 
      else: 
       break 

infile = open("file1.txt", "r") 
a=[] 
for aline in infile: 
    a = aline.split() 

insertionSort(a) 
print(a) 

Это то, что находится в файле:Сортировка списка, считанного из файла?

7686850495948548545 

Как получить функцию insertionSort() работать над файлом?

+0

Содержит ли файл все номера в одной строке? – trans1st0r

+1

, когда вы выполняете 'a = aline.split()' он не сохраняет ссылку за пределами переменной 'a', поэтому следующая итерация в цикле for перекрывает ее со следующей строкой, поэтому в итоге вы вызываете только сортировку на ** последней строке файла. ** –

+0

, если вы вместо этого сделали 'a.extend (aline.split())', вы расширили бы список всеми словами (или цифрами) в этой строке и в конечном итоге со всеми из них после цикла for. –

ответ

2

Эта часть не совсем верна.

infile = open("file1.txt", "r") 
a=[] 
for aline in infile: 
    a = aline.split() 

Предпочтительный способ открытия и чтения (или записи) файла выглядит следующим образом:

with open('some_file.txt', 'r') as in_file: 
    string_numbers = in_file.read() 

Затем, когда у вас есть цифры в строке, вы можете разделить их в список, как так:

nums_list = list(string_nums) 

так nums_list теперь список строки, конвертировать их в Интс с пониманием списка:

nums = [int(num) for num in nums_list] 

EDIT:

просто для удовольствия, вот краткий вариант:

with open('filename.txt') as in_file: 
    nums = [int(n) for n in list(in_file.read().strip())] 

.strip() добавил просто чтобы убедиться в отсутствии странной пробельные отливки.

+0

'string_nums.split()' не делает то, что вы думаете. Проверьте результат '' 7686850495948548545'.split() 'в консоли Python. – martineau

+0

Вы абсолютно, правильно, я имел в виду 'list (string_nums)'. Спасибо, отредактирован. – Will

+0

спасибо! : +) –

0

Одна из ваших проблем заключается в том, что вы повторно назначаете a. Это не то, что вы хотите. Прямо сейчас вы начинаете с назначения пустого списка a. Затем вы назначаете каждую строку, разбитую на a, каждый раз, заменяя то, что ранее было присвоено a. Я думаю, что вы на самом деле хотите внутри вашего для петли:

a.extend(aline.split()) 

Fix что и дайте нам знать, насколько хорошо ваш код работает тогда.

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