2017-02-11 7 views
1

У меня проблема, когда мне пришлось сортировать список чисел, который я сделал хорошо. Но тогда я должен ввести в список 5 наивысших чисел в списке, и я должен отметить, что есть повторяющиеся числа. Однако, когда я пытаюсь это сделать, ничего не печатает. Если я попытаюсь напечатать «count», будет напечатано только бесконечное число увеличивающихся чисел. Что я делаю не так?Python 3 Бесконечная петля с пузырьком Сортировка

list = [8,3,7,4,2,1,6,5,10,9,3,9,6,7,5] 

def sortList(list): 
    switch = 1 
    temp = int(0) 

    while (switch != 0): 
     switch = 0 
     for i in range(len(list)-1): 
      if list[i] > list[i+1]: 
       temp = list[i] 
       list[i] = list[i+1] 
       list[i+1] = temp 
       switch = 1 

# Это где моя проблема

count = int(0) 
    expensive5 = [] 

    while count != 5: 

     for i in range(len(list)-1, 0, -1): 
      if float(list[i]) > float(list[i-1]): 
       expensive5.append(list[i]) 
       count += 1 
       #if i print count here, I get an infinite number of increasing numbers 





    print(expensive5) 


sortList(list) 

ответ

0

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

expensive5 = bubble_sort(list(set(l)))[:-6:-1] 
print(expensive5) 

Кроме того, я предлагаю не использовать list в качестве имени переменной, как это функция по умолчанию для преобразования типа list. Здесь вместо этого я использую переменную l.

l = [8,3,7,4,2,1,6,5,10,9,3,9,6,7,5] 

def sortList(l): 
    switch = 1 
    temp = int(0) 

    while (switch != 0): 
     switch = 0 
     for i in range(len(l)-1): 
      if l[i] > l[i+1]: 
       temp = l[i] 
       l[i] = l[i+1] 
       l[i+1] = temp 
       switch = 1 
    return l 
+0

Я бы не рекомендовал это. Наборы не гарантируют никакого заказа на их содержимое, поэтому, в то время как CPython может в настоящее время сохранять отсортированный порядок, вы не должны полагаться на это поведение. Поэтому для этого вам нужно будет снова сортировать после создания набора. – amiller27

+1

Начиная с python 3.6, набор сохраняет порядок. – TJain

+1

Вижу, я не знал об этом. Я по-прежнему придерживаюсь своего заявления (или, по крайней мере, рекомендовал бы это разъяснить в ответе), потому что 1) не гарантируется работа над версиями раньше, чем python 3.6, и много людей, которые находятся на python 3.x не обязательно на python 3.6, и 2) преобразование в набор излишне дорого для того, что пытается сделать OP – amiller27

0

Вы можете использовать набор только получить уникальные элементы в списке, так как список сортируется вы можете получить 5 наибольшее число так:

l = [8,3,7,4,2,1,6,5,10,9,3,9,6,7,5] 

def bubble_sort(l): 
    changed = True 
    while changed: 
    changed = False 
    for i in range(len(l) - 1): 
     if l[i] > l[i+1]: 
     l[i], l[i+1] = l[i+1], l[i] 
     changed = True 
    return l 

print(list(set(bubble_sort(l)))[-5:]) #[6, 7, 8, 9, 10] 

Попробуй here!

Другие общие рекомендации:

+0

Я бы не рекомендовал это. Наборы не гарантируют никакого заказа на их содержимое, поэтому, в то время как CPython может в настоящее время сохранять отсортированный порядок, вы не должны полагаться на это поведение. Поэтому для этого вам нужно будет снова сортировать после создания набора. – amiller27

+0

OP tagged python 3.x https://docs.python.org/3/whatsnew/3.6.html#pep-520-preserving-class-attribute-definition-order – shash678

+0

Понятно, я не знал об этом. Я по-прежнему придерживаюсь своего заявления (или, по крайней мере, рекомендовал бы это разъяснить в ответе), потому что 1) не гарантируется работа над версиями раньше, чем python 3.6, и много людей, которые находятся на python 3.x aren 't обязательно на python 3.6 и 2) преобразование в набор излишне дорого для того, что пытается сделать OP – amiller27

0

Проблема заключается в том, что ваша count переменные проходит 5 на первый раз через петлю for, так count никогда не равен 5, когда цикл, а проверяет его состояние. Чтобы исправить это, вам необходимо переместить проверку внутри внутреннего петли следующим образом:

count = int(0) 
expensive5 = [] 

for i in range(len(list)-1, 0, -1): 
    if float(list[i]) > float(list[i-1]): 
     expensive5.append(list[i]) 
     count += 1 
     #if i print count here, I get an infinite number of increasing numbers 
     if count == 5: break 

print(expensive5)