Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.229.253] |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Суть в следующем пробую свои силы в освоении языка пайтон. Перевел код с другого языка. И он как-то странно работает. Нужно объяснение и правка. тестировал следующий код: ''' Переборы 2 для получения последовательностей ''' sL = [] Isxodstroka = '23651' #236513264532 print('Последовательность') print (Isxodstroka) m = len(Isxodstroka) print ('m = ',m) def IndifStrnig(S0): return 'true' Last='' for i in range(m): Next=S0[i] if Next != Last: Last = Next else:return 'false' def GenStr(S0, S1): if len(S0) == m: if IndifStrnig(S0): sL.append(S0) else: for i in range(len(S1)):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)]) GenStr('',Isxodstroka) def mylistsort(): last = mylist[-1] for i in range(len(mylist)-2, -1, -1): if last == mylist[i]: del mylist[i] else: last = mylist[i] mylist = list(set(sL)) sL = mylist for item in enumerate(sL): print(item) print(' ') print(' расчет завершен ') А то никак не соображу что именно не так Заранее спасибо. |
Сообщ.
#2
,
|
|
|
Что должен делать код?
Зачем нужна функция IndifStrnig, которая просто возвращает 'true'? |
Сообщ.
#3
,
|
|
|
что должен делать код? создавать последовательности,
но они создаюся не верно. если возвращает true происходит событие по которому происходит добавление в Лист элемент |
Сообщ.
#4
,
|
|
|
RusSun, я бы на твоём месте снабдил комментариями каждую функцию (что она должна делать). А там и ответ тебе дадут быстрее, и возможно, пока комментарии пишешь, сам додумаешься в чём проблема.
Ты ведь даже не написал, что вообще должен делать этот код. Цитата RusSun @ Он не создаёт последовательности? Создаёт. Создаёт неправильно? Тогда в чём эта неправильность заключается? что должен делать код? создавать последовательности, |
Сообщ.
#5
,
|
|
|
Цитата amk @ Он не создаёт последовательности? Создаёт. Создаёт неправильно? Тогда в чём эта неправильность заключается? Понял. Напишу позже всё подробно и с примером. Сейчас времени нет. Итак пишу как и обещал. сначала немного оффтопа: ...Доче спать не дают колики... ... Доча не даёт спать всем)))... Поэтому мысли линейны и топорны... Цитата: КВН Шутки от «Саратова» "Каким бы ни было испытание в «Форт Боярде», Николай Валуев просто шел к ключу, брал его и выходил из дверей." конец оффтопа. Теперь строго по теме. Цель: посмотрев Видеокурс "Ленивый питон" курс ленивый питон Получить такие же значения последовательностей, что и на языке Дельфи(паскаль) Решил опробовать свои силы. Что делает? Берёт строку Isxodstroka = '2332' и должна перестановками создать новые строчки. Есть условие в новых строках не должно быть два повторяющихся друг за другом числа. var Form1: TForm1; // data : array of integer; // Тут будут храниться данные Step:integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var m: integer; sL: TStringList; function IndifStrnig(S0: string):boolean; var Last,Next:string; i:byte; begin result:=true ; Last:=''; for I := 1 to m do begin Next:=S0[i]; //showmessage(Next+ ' <> '+ Last +' Last '+ Last ); //form1.Caption:='добавляем строчку '+S0; //sleep(100); if Next<>Last then Last:=Next else result:=false; end; //if Last=S0[m] then else result:=false; end; procedure GenStr(S0, S1: string); var i: integer; begin if Length(S0) = m then begin if IndifStrnig(S0) then sL.Add(S0) end else for i := 1 to Length(S1) do begin GenStr(S0+S1[i], copy(S1,1,i-1) + copy(S1,i+1,Length(S1))); inc(Step); Application.ProcessMessages;Count.Caption:=intTostr(Step) end; end; begin sL := TStringList.Create; try sL.Sorted := True; //sL.Duplicates := dupIgnore; m := Length(Edit1.Text); GenStr('',Edit1.Text); ListBox1.Items.Text := sL.Text; Label3.Caption:=intTostr(sL.Count); sL.SaveToFile('Data.txt'); finally sL.Free; end; end; По коду Главная процедура GenStr она собственно и рулит def GenStr(S0, S1): if len(S0) == m: if IndifStrnig(S0): sL.append(S0) else: for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)]) В ней использую другую функцию IndifStrnig(S0) немного изменил её, но всё равно что-то не верно. def IndifStrnig(S0): Last='' for i in range(0,m,1): Next=S0[i] if Next == Last:return 'false' else:Last = Next if Next != Last:return 'true' которая должна возвращать 'true' два элемента Next и Last не равны и последний Last присваивать новому значению Next в остальных случаях давать результат 'false' Далее делаем вызов GenStr('',Isxodstroka) со строкой '2332' к примеру затем избавляется от дубликатов (взято из справки) def mylistsort(): last = mylist[-1] for i in range(len(mylist)-2, -1, -1): if last == mylist[i]: del mylist[i] else: last = mylist[i] mylist = list(set(sL)) И в кульминации выводим что так получилось с нумерацией элементов for item in enumerate(sL): print(item) print(' ') print(' расчет завершен ') Вот: ____________________________________________ Последовательность 2332 m = 4 (0, '2333') (1, '2233') (2, '2332') расчет завершен >>> ___________________________________________ Должно быть так результат две последовательности в другом коде 2323 3232 я предполагаю выглядеть должно так: (, хотя на деле у меня не вышло) Последовательность 2332 m = 4 (0, '2323') (1, '3232') расчет завершен |
Сообщ.
#6
,
|
|
|
Так мне только что дошло что можно поправить
def GenStr(S0, S1): if len(S0) == m: if not IndifStrnig(S0): sL.append(S0) else: for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)]) он добавлял всё неверные варианты изменил процедуру на if not IndifStrnig(S0) и сразу появился один из двух правильных ответов (0, '2323') Теперь остаётся узнать как мне добиться от него чтобы он дальше сделал работу с последовательностью начинающуюся с 3.. и добавил ещё один результат 3232 sL = [] Isxodstroka = '2332' #236513264532 print('Последовательность') print (Isxodstroka) m = len(Isxodstroka) print ('m = ',m) def IndifStrnig(S0): Last='' for i in range(0,m,1): Next=S0[i] if Next == Last:return 'false' else: Last = Next if Next != Last:return 'true' #2323 #3232 #else:return 'false' def GenStr(S0, S1): if len(S0) == m: if not IndifStrnig(S0): sL.append(S0) else: for i in range(0,len(S1),1):GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)]) GenStr('',Isxodstroka) def mylistsort(): last = mylist[-1] for i in range(len(mylist)-2, -1, -1): if last == mylist[i]: del mylist[i] else: last = mylist[i] mylist = list(set(sL)) sL = mylist for item in enumerate(sL): print(item) print(' ') print(' расчет завершен ') |
Сообщ.
#7
,
|
|
|
Итак финальная правка
меняем в строке 27 старый код GenStr(S0+S1[i],S1[1:i-1]+S1[i+1:len(S1)]) GenStr(S0+S1[i],S1[0:i]+S1[i+1:len(S1)+1]) Посмотрел более внимательно тему срезы два нюаса 1 строка начинается с 0. 2 второе число читал здесь "Оператор извлечения среза: [X:Y]. X – начало среза, а Y – окончание; символ с номером Y в срез не входит." Сделав поправки получаем рабочий код. Надеюсь я не ошибся.) Итак странность заключалась в неверном понимании работы кода. Тема закрыта. |