[Python] Esercizio con funzione su stringhe
Salve, ho questo esercizio: "Scrivere una funzione che, ricevuti come parametri una lista di stringhe “v” ed un intero “k”, restituisca una stringa costruita come descritto di seguito.
*La stringa è costruita per passi, “prendendo” ad ogni passo una stringa da “v”.
*Il numero totale di passi sarà pari a “k”.
*Al primo “passo” si seleziona da v la stringa in prima posizione (posizione “zero”).
*Ad ogni passo successivo al primo, si seleziona da “v” la stringa presente “k” posizioni in avanti rispetto alla stringa selezionata al passo precedente. Si noti che “v” deve essere considerata come “circolare”, ovvero l’ultima posizione ha come posizione successiva la prima."
Io avrei risolto così:
Questo metodo funziona, solo che impiega un numero, maggiore di k*k, di passi, che per k che cresce diventa piuttosto grande, e mi stavo chiedendo se esiste un metodo più diretto e meno "costoso" (non so se il termine è corretto), per esempio attraverso qualche generalizzazione per quanto riguarda gli indici della lista v.
*La stringa è costruita per passi, “prendendo” ad ogni passo una stringa da “v”.
*Il numero totale di passi sarà pari a “k”.
*Al primo “passo” si seleziona da v la stringa in prima posizione (posizione “zero”).
*Ad ogni passo successivo al primo, si seleziona da “v” la stringa presente “k” posizioni in avanti rispetto alla stringa selezionata al passo precedente. Si noti che “v” deve essere considerata come “circolare”, ovvero l’ultima posizione ha come posizione successiva la prima."
Io avrei risolto così:
def stringa (v, k): ris='' mat=[] cont= 0 for i in range (k*k): for j in v: mat.append (j) for i in range (len (mat)): if i%k==0: ris+= mat[i] cont+=1 if cont==k: return ris
Questo metodo funziona, solo che impiega un numero, maggiore di k*k, di passi, che per k che cresce diventa piuttosto grande, e mi stavo chiedendo se esiste un metodo più diretto e meno "costoso" (non so se il termine è corretto), per esempio attraverso qualche generalizzazione per quanto riguarda gli indici della lista v.
Risposte
Forse ho capito male io, ma una cosa come
def stringa(v,k): if v == [] or k == 0: return '' s = '' for i in range(0,k): s += v[(i * k) % len(v)] return sperché non ti piace?
Non è che non mi piaccia, non ho mai fatto informatica prima e non mi è venuto in mente. Ho chiesto qui apposta
Grazie dell'aiuto
Grazie dell'aiuto
Più per scopo didattico che per altro è anche possibile scrivere il programma nel seguente modo:
L'espressione [tt]v[(i * k) % len(v)] for i in range(k)[/tt] restituisce la sequenza di stringhe da incollare tra di loro mentre è [tt]''.join(...)[/tt] prende una lista di stringhe e le incolla una con l'altra.
def stringa(v, k): return ''.join(v[(i * k) % len(v)] for i in range(k))
L'espressione [tt]v[(i * k) % len(v)] for i in range(k)[/tt] restituisce la sequenza di stringhe da incollare tra di loro mentre è [tt]''.join(...)[/tt] prende una lista di stringhe e le incolla una con l'altra.
Grazie apatriarca
