2016-11-28 4 views
-1

В настоящее время я выполняю проект, который требует от меня создания некоторых встроенных модулей Pythons без каких-либо встроенных модулей. Моя программа создает список из 500 элементов с диапазоном случайных чисел в 1 999. Моя проблема возникает с моей функцией find_max (numbers).Loop stopping on third element in list

def find_max(numbers): 
    i = 0 
    stop = 0 
    a = i+1 
    count = 0 
    if numbers[1] > numbers[2]: 
      greatest = numbers[1] 
    elif numbers[2] > numbers[1]: 
      greatest = numbers[2] 
    while count != 500: 
      if greatest > numbers[i]: 
        i += 1 
        count += 1 
      elif numbers[i] > greatest: 
        greatest = numbers[i] 
        i += 1 
        count += 1 
      else: 
        count+=1 
    print("The greatest: "+str(greatest)) 
    mainmenu(numbers) 

Когда я использую это до или после сортировки своего списка, он всегда останавливается на третьем элементе. Функция find_min (numbers) - это зеркальная копия max с < intstead of> и всегда удается найти самое низкое значение до или после сортировки моего списка. Я пробовал использовать для count в диапазоне (len (list)): как мое условие для цикла с теми же результатами.

ВЫВОД:

Пожалуйста, введите Ваш пункт меню: макс

Наибольшее: 10

LIST (после сортировки):

Пожалуйста, введите Ваш пункт меню: сортировать

[1, 7, 10, 11, 12, 13, 13, 14, 20, 29, 34, 38, 38, 39, 41, 44, 45, 51, 55, 56, 57, 57, 57, 62, 63 , 69, 72, 73, 77, 78, 82, 83, 83, 95, 96, 98, 100, 102 , 103, 104, 105, 106, 106, 111, 114, 114, 115, 116, 117, 123, 123, 125, 126, 127, 132, 134, 134, 135, 136, 138, , 142, 142, 142, 146, 148, 149, 151, 154, 156, 158, 158, 161, 163, 166, 166, 168, 170, 173, 173, 175, 175, 176, 182, 183, , 190, 197, 197, 204, 204, 205, 207, 207, 207, 213, 216, 217, 217, 219, 219, 221, 221, 221, 221, 222, 225, 227, 230, 233, 236 , 243, 244, 249, 250, 250, 250, 253, 254, 256, 260, 261, 262, 265, 267, 268, 275, 276, 277, 278, 286, 290, 293, 294, 297, 299 3012, 302, 304, 305, 307, 308, 308, , 347, 348, 352, 354, 355, 355, 355, 357, 357, 359, 362, 363, 367, 368, 370, 373, 374, 374, 378, 385, 387, 387, 391, 391, 392 , 393, 399, 401, 403, 409, 417, 418, 419, 419, 421, 421, 424, 424, 428, 428, 430, 431, 432, 432, 434, 436, 436, 436, 438, 441 , 441, 446, 447, 449, 450, 450, 452, 454, 456, 457, 457, 457, 457, 459, 463, 464, 467, 470, 470, 471, 475, 475, 476, 478, 479 , 484, 489, 490, 501, 503, 504, 504, 507, 511, 513, 513, 513, 516, 516, 522, 532, 533, 534, 534, 537, 538, 538, 540, 548, 552 , 557, 557, 562, 563, 563, 564, 572, 573, 574, 576, 577, 579, 583, 583, 584, 587, 588, 589, 592, 592, 592, 594, 595, 596, 598 , 601, 602, 604, 605, 605, 606, 606, 607, 617, 617, 619, 622, 622, 625, 626, 627, 629, 631, 634, 636, 637, 642, 642, 643, 643 , 653, 654, 656, 658, 658, 663, 669, 672, 672, 673, 674, 674, 679, 680, 681, 682, 683, 685, 692, 695, 696, 696, 698, 699, 709 , 709, 710, 710, 711, 717, 727, 727, 735, 740, 741, 743, 746, 754, 754, 755, 757, 764, 765, 765, 768, 769, 773, 773, 783, 786 , 788, 791, 792, 792, 793, 798, 800, 803, 803, 809, 809, 809, 813, 813, 813, 814, 815, 815, 816, 817, 817, 819, 821, 822, 823 , 824, 824, 826, 827, 829, 829, 830, 830, 831, 831, 834, 835, 839, 840, 841, 841, 842, 842, 842, 843, 843, 843, 844, 850, 853 , 854, 863, 863, 864, 868, 869, 870, 875, 877, 879, 880, 880, 882, 884, 884, 886, 887, 887, 889, 893, 894, 896, 896, 897, 897 , 999, 917, 917, 919, 920, 920, 921, , 928, 931, 932, 932, 935, 935, 936, 937, 938, 943, 949, 951, 951, 953, 954, 956, 958, 958, 959, 960, 966, 974, 974, 975, 976 , 978, 979, 983, 984, 987, 991, 993, 993, 994, 995, 998, 999]

UPDATE:

Вот код, который относится к вопросу:

def initial(): 
    numbers = [] 
    i = 0 
    while i <= 499: 
      temp = random.randint(1,999) 
      numbers.append(temp) 
      i += 1 
    return numbers 

def find_min(numbers): 
    i = 0 
    if numbers[1] < numbers[2]: 
      least = numbers[1] 
    elif numbers[2] < numbers[1]: 
      least = numbers[2] 
    for element in range(len(numbers)): 
      if least < numbers[i]: 
        i += 1 
      elif numbers[i] < least: 
        least = numbers[i] 
        i += 1 
    print("The lowest: "+str(least)) 
    mainmenu(numbers) 
+1

Для вашего обучения это полностью разрешимо с помощью отладчика (https://docs.python.org/2/library/pdb.html). Если вы сами выясните причину, она будет работать дольше. – Mai

+2

Вам действительно не нужны индексы для решения этой проблемы. 'для числа в числах:' будет перебирать каждое число. –

+0

Есть несколько проблем. Шаг через код с ручкой и бумагой и тестовым набором. Какое начальное значение имеет наибольшее значение, если числа [1] == numbers [2]? Что происходит в вашем цикле while, если числа [i] == наибольшие? Я думаю, вы обнаружите, что ваши тестовые данные, вероятно, имеют одинаковые значения для нескольких первых чисел. – Kif

ответ

1

Я борюсь с погодой, чтобы ответить на этот вопрос и потенциально лишить вас возможности понять это. Тем не менее, я думаю, что есть также смысл видеть более чистый способ делать то, что вы пытаетесь выполнить. Я многому учусь от того, чтобы видеть код другого. Вы решаете, хотите ли вы использовать это или работать самостоятельно.

>>> def find_max(numbers): 
    greatest = numbers[0] 
    for x in numbers: 
     if x > greatest: 
      greatest = x 
    return greatest 

>>> find_max([3,400,200,100,500,250]) 
500 

>>> find_max([250,500,100,200,400,3]) 
500 

Обратите внимание, что python автоматически перейдет по номерам - вам не нужно управлять приращениями. В этом случае это похоже на то, что вы увидите в цикле for-each на других языках, если хотите посмотреть его.

Также обратите внимание, насколько проще логика сравнения. Это довольно распространенный шаблон для подобных вещей, поэтому, вероятно, стоит вам успеть с этим подходом.

+0

Спасибо, это очень полезное решение. Я спешил через это задание, когда начал, и моей логике было очень трудно следовать даже для меня, поэтому это очень полезно. Я в основном спрашивал, где моя программа была неудачной, потому что я не мог понять, почему во время или даже для циклов, которые я использовал, не удалось. –

1

Вы не указали индекс вашего индекса, i.Я нашел эту проблему с помощью простого печати:

while count != len(numbers): 
     print (count, i, numbers[i], greatest) 
     if greatest > numbers[i]: 

Это показывает трудности, вызываемым с:

test = [3, 1, 4, 1, 5, 9] 
find_max(test) 

Выход:

0 0 3 4 
1 1 1 4 
2 2 4 4 
3 2 4 4 
4 2 4 4 
5 2 4 4 
The greatest: 4 

Прежде всего, ваш окончательный еще положение не увеличивается i. Вам не нужно использовать два счетчика параллельно: используйте либо count, либо i, не оба.

Во-вторых, так как вы знаете заранее, сколько раз вы идете через петлю, используйте для цикла, а не в то время как :

for i in range(len(numbers)): 

Еще лучше, так как вы на самом деле не нужно знать где максимальный элемент находится в списке, просто итерацию по списку (я вижу, что Марк Tolonen также ударил это в комментарии):

for element in numbers: 

Наконец, это изменение избавит вас от обновления счетчиков в , если, так что у вас нет всего этого неприятного избыточного кода.