2015-02-27 3 views
-1

Я делаю сортировку слияния в python, но у меня есть проблема. Когда я пытаюсь вставить список из консоли (по одному числу на строку, которая возвращает список строк), я не могу преобразовать его в целые числа. Можете ли вы помочь мне понять проблему.AttributeError: объект 'int' не имеет атрибута 'split'

import sys 

def mergeSort(lista): 
    res = [] 
    for i in lista[0].split(): 
     res.append(int(i)) 
    if len(res)>1: 
     mid = len(res)//2 
     lefthalf = res[:mid] 
     righthalf = res[mid:] 
     mergeSort(lefthalf) 
     mergeSort(righthalf) 
     i=0 
     j=0 
     k=0 
     while i<len(lefthalf) and j<len(righthalf): 
      if lefthalf[i]<righthalf[j]: 
       res[k]=lefthalf[i] 
       i=i+1 
      else: 
       res[k]=righthalf[j] 
       j=j+1 
      k=k+1 

     while i<len(lefthalf): 
      res[k]=lefthalf[i] 
      i=i+1 
      k=k+1 

     while j<len(righthalf): 
      res[k]=righthalf[j] 
      j=j+1 
      k=k+1 
    print(res) 

alist = [] 
for l in sys.stdin: 
    alist.append(l.strip()) 
mergeSort(alist) 

Ошибка код говорит: AttributeError: «INT» объект не имеет атрибута «раскола» ввода является файлом (при условии из оболочки с помощью команды: «python3 merge.py < data.txt») со списком цифр по одной в строке. Пример: Если вернуться 0 2 3 4 7 11 12 Конечно я не выход из-за ошибки

+1

Все это означает, что первым элементом в 'lista' является объект' int', а не строка. Как-то ваш код - это добавление целого числа в список, который вы проходите. Таким образом, это не может быть полный пример кода ... – Iguananaut

+0

, но все они являются единственной строкой ... – user28011994

+0

Единственное место, где отображается ваш код, который использует 'str.split()' находится в элементе списка, который якобы содержит строки. Вероятно, вы не смотрите на тот же код, который вы используете, или вы не опубликовали тот же код, который вы используете здесь. – Iguananaut

ответ

0

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

Вы должны обрабатывать весь разбор файлов, полностью отделенный от вашей подпрограммы mergeSort, которая должна быть предназначена для работы над списком чисел. Это «разделение проблем».

+0

Абсолютно верно. Я сделал исправление. Должен ли я поставить исправленный код наверх? – user28011994

+0

Если хотите. Может быть, лучше, чтобы будущие читатели увидели обе версии или, как минимум, соответствующие обновления (не обязательно две полные версии кода, так как детали сортировки слияния не имеют значения). – Iguananaut

1

Она должна быть достаточно for i in lista чем for i in lista[0].split(), и вы можете просто достичь его списка понимания: res = [int(num) for num in lista]

+0

Я уже делаю это, и я получаю сообщение об ошибке: недействительный литерал для int() с базой 10: '1 \ r3 \ r4 \ r56 \ r65 \ r3 \ r4 \ r3 \ r2 \ r9 \ r10' – user28011994

+0

Вот почему я разделил – user28011994

+0

@ user28011994 Вы уверены, что в вашем data.txt есть одно число в строке? Похоже, ваш 'alist' содержит только 1 элемент со всеми числами в нем, что странно. –

1

Если вы также хотите индекс, вы можете использовать enumerate:

data = ['itemA', 'itemB', 'itemC', 'itemD'] 
for (i, item) in enumerate(data): 
    print("Item #%d is %s" % (i, str(item))) 

Для дальнейшего использования, вы можете отлаживать так:

def mergeSort(lista): 
    res = [] 
    print(lista) 
    for i in lista[0].split(): 
     print(i) 
     res.append(int(i)) 
+0

Не понимаю .... – user28011994

+0

Добавить операторы печати, чтобы увидеть содержимое переменной 'lista' до начала цикла, а содержимое' i' в начале каждая итерация - они могут быть не такими, какими вы ожидаете. –

+0

И действительно, это был не тот результат, который я искал.Результат lista равен '1 \ r3 \ r4 \ r56 \ r65 \ r3 \ r4 \ r3 \ r2 \ r9 \ r10' (Вот почему я использовал split), и я не могу вывести 'i' из-за ошибки в петля – user28011994