Я не могу найти логическую ошибку в этом коде сортировки пузырьков - PullRequest
1 голос
/ 25 мая 2009

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

#test data:  45,5j, f,e,s , , , 45,q,

    if __name__ == "__main__":
getList = input("Enter numbers separated by commas:\n").strip()
listOfBubbles = getList.split(',')
print (listOfBubbles)
i = 0
for k in listOfBubbles:
    listOfBubbles[i] = k.strip()
    print ("i = {0} -- Checking '{1}'".format(i,listOfBubbles[i]))
    if listOfBubbles[i] == '' or listOfBubbles[i] == ' ':
        del listOfBubbles[i]
        i -= 1
    else:
        try:
            listOfBubbles[i] = int(listOfBubbles[i])
        except ValueError as ex:
            #print ("{0}\nCan only use real numbers, deleting '{1}'".format(ex, listOfBubbles[i]))
            print ("deleting '{0}', i -= 1".format(listOfBubbles[i]))
            del listOfBubbles[i]
            i -= 1
        else:
            print ("{0} is okay!".format(listOfBubbles[i]))
    i += 1

print(repr(listOfBubbles))

Выход:

    Enter numbers separated by commas:
45,5j, f,e,s , , , 45,q,
['45', '5j', ' f', 'e', 's ', ' ', ' ', ' 45', 'q', '']
i = 0 -- Checking '45'
45 is okay!
i = 1 -- Checking '5j'
deleting '5j', i -= 1
i = 1 -- Checking 'e'
deleting 'e', i -= 1
i = 1 -- Checking ''
i = 1 -- Checking '45'
45 is okay!
i = 2 -- Checking 'q'
deleting 'q', i -= 1
[45, 45, ' ', ' 45', 'q', '']

Ответы [ 5 ]

1 голос
/ 25 мая 2009

Как насчет более питонического пути?

#input
listOfBubbles = ['45', '5j', ' f', 'e', 's ', ' ', ' ', ' 45', 'q', '']
#Copy input, strip leading / trailing spaces. Remove empty items
stripped = [x.strip() for x in listOfBubbles if x.strip()]    

# list(filtered) is ['45', '5j', 'f', 'e', 's', '45', 'q']
out = []
for val in filtered:
  try:
    out.append(int(val))
  except:
    # don't do anything here, but need pass because python expects at least one line
    pass 
# out is [45, 45]

Наконец, чтобы перейти к правильному ответу

out.sort()

Обновление Чтобы уточнить пропуск

>>> for i in range(0,5):
        pass
        print i

0
1
2
3
4
0 голосов
/ 25 мая 2009

Если вы собираетесь удалить из списка во время итерации по нему, просмотрите список в обратном порядке:

for( i = myList.length - 1; i >= 0; i-- ) {
   // do something
   if( some_condition ) {
      myList.deleteItem( i );
   }
}

Таким образом, вы не пропустите ни одного элемента списка, поскольку сокращение списка не влияет на будущие итерации. Конечно, приведенный выше фрагмент предполагает, что метод deleteItem поддерживается в классе list / array и выполняет соответствующие действия.

0 голосов
/ 25 мая 2009

фигу, исправил. Я изменяю цикл с ... на какое-то время ...

if __name__ == "__main__":
    getList = input("Enter numbers separated by commas:\n").strip()
    listOfBubbles = getList.split(',')
    print (listOfBubbles)
    i = 0
    while i < len(listOfBubbles):
        listOfBubbles[i] = listOfBubbles[i].strip()
        print ("i = {0} -- Checking '{1}'".format(i,listOfBubbles[i]))
        if listOfBubbles[i] == '' or listOfBubbles[i] == ' ':
            del listOfBubbles[i]
            i -= 1
        else:
            try:
                listOfBubbles[i] = int(listOfBubbles[i])
            except ValueError as ex:
                #print ("{0}\nCan only use real numbers, deleting '{1}'".format(ex, listOfBubbles[i]))
                print ("deleting '{0}', i -= 1".format(listOfBubbles[i]))
                del listOfBubbles[i]
                i -= 1
            else:
                print ("{0} is okay!".format(listOfBubbles[i]))
        i += 1

    print(repr(listOfBubbles))
0 голосов
/ 25 мая 2009

Нельзя использовать итератор для удаления из списка, поскольку длина изменяется.

Вместо этого вы должны использовать индекс в цикле for (или в цикле while).

После того, как вы удалили предмет, вам нужно снова пройтись по списку.

псевдо-код:

again:
for i = 0 to list.count - 1
{
  if condition then 
    delete list[i] 
    goto again;
}
0 голосов
/ 25 мая 2009

Никогда не изменяйте тот самый список, над которым вы зацикливаетесь - внутри цикла for k in listOfBubbles:, вы удаляете некоторые элементы этого самого списка, и это нарушает логику внутреннего цикла. Есть много альтернативных подходов, но самое простое решение - зациклить копию списка, который вы хотите изменить: for k in list(listOfBubbles):. Могут быть и другие проблемы, но это первая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...