2016-11-25 3 views
0

Вопрос:экстракт подпоследовательности Python

Приведенная последовательность чисел вычитает подпоследовательность максимальной длины, которая находится в порядке возрастания.

Пример ввода: L = [1,3,5,6,1,5,1,6,7]

Выход: [1,3,5,6]

Код:

def Sequence(integers): 


sequence = [] 
i = 0 
stored = [] 
#newseq = [] 

for i in range(len (integers)-1) : 

    if integers[i] <= integers[i+1]: #i less than i+1 append to sequence 
     stored.append(integers[i]) 
     sequence.append(integers[i]) 

    else: 
     if integers[i] >= integers[i+1]: 

      del sequence[:] 

    if len(stored) > (len(sequence)): 
     print('biggest subseq =',stored) 
     print('small sub',sequence) 

print (stored,sequence) 

Sequence([1,2,3,4,5,1,2,4,5]) 

Ошибка:

Он выводит [1, 2, 3, 4, 1, 2, 4] [1, 2, 4]

Но следует вывод: [[1, 2, 3, 4,5] [1, 2, 4, 5]

Как это исправить?

ответ

1

once this works I can display the biggest subsequence. any ideas?

Моя идея в том, что это не сработает, вам нужно переписать его довольно много.

Вы начинаете с прокручивания цифр (for i in ...), и это замечательно, и первый тест if забирает пробег все большего числа номеров, OK до сих пор. Но затем вы добавляете числа к stored и sequence. Зачем добавлять то же самое к обоим?

Затем else запускает, если последовательность перестает увеличиваться. Это круто, вы можете следить за возрастающей последовательностью и заметить, когда она закончится. Но вы не доверяете этому, и вы делаете то же самое испытание снова с другим if, потому что ... причины? Там вы удаляете sequence. «Я буду отслеживать все последовательности, и когда они закончатся, я выброшу их, не используя их, потому что выбросить вещи, которые я ищу, просто отлично :)».

ОК, из названий, которые вы задали, я думаю, sequence должен быть «текущей последовательности, я работаю над».

После этих тестов if, для каждой итерации цикла вы проверяете len(stored); stored никогда не очищается или не перезагружается, поэтому он просто создает почти все числа в исходном списке. Как только вы выполните этот тест длины, вы ничего не делаете, кроме печатных вещей.

Что вы печатаете: print('biggest subseq = ', sequence) - делает его похожим именем sequence должен быть «самым большим», но это неправильно по сравнению с тем, как вы использовали его ранее. sequence не самый большой, это текущий, не так ли? Или не так? «Я буду использовать бесполезные имена, потому что мне не нравится набирать длинные имена. Почему мой код не работает?». Да, я тоже так все время.

Затем вы печатаете, что stored является «малым югу»? Что такое маленький суб? Что бы это ни было, stored не держит ничего полезного на данный момент.

И как вы отслеживаете номера i >= i+1 и добавляете только i, чтобы соответствовать последовательности, означает, что вы всегда пропустите последний номер в каждой последовательности. («следующий меньше, поэтому я пропущу добавление этого»).

и хуже того, как вы отслеживаете range(len(integers) - 1) означает, что вы никогда не проверяете последнее число в исходном списке в конечной подпоследовательности.

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


Я думаю, что вы пытаетесь сделать, это «трек вперед, пока последовательность не заканчивается, и хранить его. Затем найдите следующую последовательность. Если это больше, чем ранее сохраненного один, сохраните новый вместо". Итак:

  1. Дайте себе ясные имена переменных, которые объясняют, для чего они предназначены.

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

  3. Это должно произойти в том месте, где заканчивается последовательность, а не для каждого номера в списке ввода.

  4. Это означает, что обновление для stored должно произойти внутри if len(stored) > len(sequence).

  5. .., который должен протестировать другим способом - это новый, длинный, чем сохраненный.

  6. И необходимо предпринять действия для обновления магазина.

Попытка написать, что, как можно ближе к коду, как я могу, получает меня это:

def Sequence(integers): 

    longest_sequence = [] 
    current_sequence = [] 

    for i in range(len(integers)): 

    if i < len(integers) - 1 and integers[i] <= integers[i+1]: # sequence continues 
     current_sequence.append(integers[i]) 
     print('current_sequence ', current_sequence) 

    else:       # else sequence, or input, ends now 
     current_sequence.append(integers[i]) # catch this last number in sequence, too 
     print('\nsubseq ended ', current_sequence) 

     # now we've hit the end of a subsequence 
     # do we replace the stored one, or not? 
     if len(current_sequence) > len(longest_sequence): 
     print('\nreplacing previous longest ', longest_sequence) 

     longest_sequence = current_sequence 

     # either way, reset the current sequence tracker 
     current_sequence = [] 

    print() 
    print ('Finished. Longest found: ', longest_sequence) 


Sequence([1,2,3,4,5,1,2,4,5]) 
print('\n----\n') 
Sequence([1,2,4,5,1,2,3,4,5]) 

Что вы можете run online at repl.it here.

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