[Python] Esercizio con funzione su stringhe

Str11
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ì:
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
marco2132k
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 s
perché non ti piace?

Str11
Non è che non mi piaccia, non ho mai fatto informatica prima e non mi è venuto in mente. Ho chiesto qui apposta
Grazie dell'aiuto

apatriarca
Più per scopo didattico che per altro è anche possibile scrivere il programma nel seguente modo:
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.

Str11
Grazie apatriarca :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.