decalarea ciclică a caracterelor în șir

Subclass sstr of the standard str type that implements the "<<" and ">>" methods as a cyclic shifting of the characters in the string.What trying to do is

 >>> s1 = sstr("abcde")
 >>> s1 << 0
'abcde'
 >>> s1 >> 0
'abcde'
 >>> s1 << 2
'cdeab'
>>> s1 >> 2
'deabc'
>>> s1 >> 5
 'abcde'

# my attempt:
import string
class sstr(str):
def __new__(self, other):
    return str.__new__(self, other.upper())
def __ilshift__(self, other):
    return str.__ilshift(other)
def __rshift__(self, other):
    return str.__rshift(other)    
1
Temă la domiciliu și lucrări de zi cu zi această lecție a fost lipsită ..........
adăugat autor Python_Woo, sursa
Cred că asta e temele?
adăugat autor Jeremy Pridemore, sursa

2 răspunsuri

Acest lucru miroase ca temele, deci nu voi posta aici codul real. Dar pentru a vă ajuta, voi sublinia defectele pe care le văd în cod și un algoritm:

Python 2.7.2 nu raportează __ ilshift sau __ irshift în str . De asemenea, dacă încercați să schimbați un șir cu un anumit număr de caractere, atunci nu ar trebui să schimbați variabila pe care o numiți other . Ar trebui să schimbați self cu other mai multe caractere. Acestea fiind spuse, probabil că este mai bine să numiți other ca n sau altele asemenea.

Acum, presupun că știi cum ar trebui să funcționeze schimbarea circulară. Exemplele pe care le oferiți primesc mesajul bine.

Ca un algoritm simplu (ușor de citit/înțeles), încercați acest lucru (urmează codul pseudo):

function __ilshift(self, n) {//self is the string to be shifted. n denotes how many characters to shift it by
    answer = copy()
    for i = 1 to n {
        answer = self[1:] //answer = everything in self excluding the first character
        answer += self[0]//append the first character of self to answer
    }
    return answer
}

Soluția de mai sus ar funcționa. Deși este destul de ineficientă. Știm că atunci când un șir n-caractere este mutat de n , rezultatul schimbării este șirul propriu-zis. Când te gândești mai mult la asta, îți dai seama că termini trecerea cu n% lengthOfSelf . Astfel, pentru i = 1 până la n devine pentru i = 1 până la n% len (self) .

Totuși, putem face acest lucru mai eficient. Pentru a face acest lucru ar fi nevoie de splicing self la indexul corespunzător, pe care vă voi lăsa să-l dați seama, deoarece cred că aceasta este temele.

Sper că acest lucru vă va apropia!

2
adăugat
Știu asta, și de aceea i-am spus să se taie la sfârșitul postului meu. Cu toate acestea, din moment ce acest lucru pare a fi temele, nu am vrut să dau calea cea mai bună de a rezolva problema la început; mai degrabă, am vrut să iau OP prin procesul de gândire. La urma urmei, dacă acest lucru este într-adevăr temă, atunci trebuie să fie pentru CS101 sau cam asa ceva, ceea ce înseamnă că OP nu este un programator foarte experimentat în acest moment și că, prin urmare, ar putea beneficia de un astfel de proces de gândire ghidat
adăugat autor inspectorG4dget, sursa
Vă mulțumim pentru ajutorul dvs. Am reușit să finalizez lecția după ce am folosit metodele corecte rshift și lshift .
adăugat autor Python_Woo, sursa
Nu este nevoie de o buclă; puteți să decupați numai caracterele n și să le puneți la sfârșit.
adăugat autor Karl Knechtel, sursa
s1 << 0

Aceasta numește __ lshift __ , nu __ ilshift __ . Codul i se referă la locație; nu puteți schimba oricând un șir în loc și nu încercați aici (încercați să creați o nouă valoare).

Problema cu codul dvs. real este că încercați să implementați schimbarea prin apelarea schimbării clasei de bază str . Dar clasa de bază str nu are operația de schimbare - acesta este motivul pentru care aveți acest exercițiu!

Hint: put together two slices of the string. 'foobar' << 2 is 'obar' + 'fo'. Can you see how to slice the string to get those? How do the numbers you use for the slices relate to the number specified for shifting?

0
adăugat
Înțeleg că trebuie să indice și să taie șirul. Dacă te uiți la prima mea postare există un exemplu folosind consola, atunci când eu sau << în consolă primesc: TypeError: tipuri de operand neacceptate pentru <<: 'sstr' și 'int' După cum ați spus în operatorul dvs. post << și >> nu fac parte din clasa de șir. Ce trebuie să fac pentru a putea să le folosesc ca argumente?
adăugat autor Python_Woo, sursa
Trebuie să le definiți în subclasa dvs., trebuie să utilizați denumirile corecte așa cum am sugerat și trebuie să scrieți o definiție care (a) nu să încerce să apeleze definițiile clasei de bază (deoarece nu există); (b) utilizați indexarea și felierea.
adăugat autor Karl Knechtel, sursa
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.