Почему мой оператор IF не выполняется

Дело в том, что я делаю исключение, чтобы написать программу, которая печатает самую длинную подстроку s, в которой буквы встречаются в алфавитном порядке. Например, если s = 'azcbobobegghakl', ваша программа должна напечатать:

Самая длинная подстрока в алфавитном порядке: begingh

В случае ничьей выведите первую подстроку. Например, если s = 'abcbcd', ваша программа должна напечатать:

Самая длинная подстрока в алфавитном порядке: abc

Я провел тесты, и он работает с большинством строк, которые я вставляю, но это проблематично.

На шаге 15 он должен сравнить 2 > 0, что верно, но не выполняется, может кто-нибудь объяснить это? Где я ошибаюсь?

Мой код выглядит так:

s = 'zodworqozid'
curstring = [0]
longest = [0]
for i in range(1,len(s)):
    if s[i] >= str(curstring[-1]):
        curstring+= s[i]
        if len(curstring) > len(longest):
            longest = curstring
    else:
        curstring = s[i]

print('Longest substring in alphabetical order is:', longest)

Я использую наставник по Python, чтобы помочь визуализировать шаги


person Jurkis    schedule 14.02.2017    source источник
comment
len([0]) = 1 - если вы хотите инициализировать пустой список, вы должны использовать longest = []   -  person asongtoruin    schedule 14.02.2017


Ответы (2)


Здесь:

curstring = [0]
longest = [0]

вы создаете два списка с одним элементом внутри, который является целым числом (0).

Позже здесь:

if s[i] >= str(curstring[-1]):

вы проверяете, имеет ли данная буква более высокое значение, чем последний элемент в списке. Поскольку Python отсчитывается от нуля, вы начинаете с буквы 'o' (потому что это имеет индекс 1, который оказывается первым в вашем списке диапазонов).

for i in range(1,len(s)):

Сравнение символов (букв) основано на таблице ASCII, поэтому любая указанная буква будет иметь "большее значение", чем 0 ('o' равно 111).

Поскольку условие из второго блока кода истинно, буква «о» добавляется в список в этом блоке:

curstring+= s[i]

и после этого в списке curstring есть два элемента: 0 и 'o'.

if len(curstring) > len(longest):

Здесь вы сравниваете curstring (описанный выше) и самый длинный, который представляет собой список с одним элементом в нем: 0 (поскольку вы создали список с одним элементом в первом блоке кода, описанного выше). Условие истинно (2 элемента - это более одного элемента), поэтому теперь самый длинный указывает на тот же список, что и curstring, и поэтому имеет два элемента (и длина = 2).

Позже, как вы можете видеть в предоставленном вами визуализаторе, ссылочная переменная curstring не указывает на список. Его тип меняется при выполнении этой строки:

curstring = s[i]

поэтому позже, когда добавляется символ, при выполнении шага 15. оказывается, что это двухбуквенная строка «dw». Эта строка сравнивается со списком самый длинный из двух элементов (который был описан выше). Строка «dw» имеет длину 2, а список - 2, поэтому условие ложно.

Вам следует немного прочитать о типах в Python и о том, как переменные создаются и поддерживаются в коде - это поможет вам отловить эти небольшие ошибки. Имейте в виду, что Python имеет другой синтаксис, когда дело доходит до списков, чем такие языки, как C ++ или Java - я предполагаю, что вы написали этот код.

curstring = [0]
longest = [0]

на основе опыта работы с массивами / списками на других языках. Пустой список в Python создается так:

new_list = []
person Jonarz    schedule 14.02.2017

Ошибка 1:

curstring = [0]

Вы захотите инициализировать свой curstring первым символом в s (вместо списка, содержащего целое число 0). Я вижу, что вы уже знаете, как это сделать в своем коде. (т.е. s[0]) Это сделано для того, чтобы ваш последующий код правильно сравнивал следующий символ с первым символом в s.

Ошибка 2:

longest = [0]

Вы захотите инициализировать longest как пустой список str (т.е. "") вместо list, содержащего целое число 0. Это потому, что вам не нужны функции списка в longest, поскольку вы напрямую возвращаете str.

Ошибка 3:

longest = curstring

Вы захотите сделать копию curstring вместо того, чтобы связывать longest с curstring. Сделайте это либо с list(curstring), либо с curstring[:]. Здесь нет ошибок. Я неправильно прочитал curstring как list, когда это str.

person ooknosi    schedule 14.02.2017
comment
Если curstring - это строка, почему копия для longest? Это не значит, что объект является изменяемым. - person Martijn Pieters; 14.02.2017
comment
@MartijnPieters Вы правы, я неправильно истолковал curstring как list вместо str. Спасибо. - person ooknosi; 14.02.2017