Es. 8. 08/05

Da aptiva.

Carmela ieri ha proposto questa soluzione:

lista=[]
i=0
n=1
parola=""
while i<n:
    i+=1
    n+=1
    parola=input("scrivi una parola oppure no per uscire")
    if (parola!="no"):
        lista.append(parola)
        lunghezzaparola=len (parola)
    else:
        break

nuovalista=[]
x=0
contacarattere=-1
while x<lunghezzaparola:
    x+=1
    posizioneparolalista=0
    nuovaparola=""
    word=""
    contacarattere+=1
    for y in lista:
        word=lista[posizioneparolalista]
        primocarattere=word[contacarattere]
        nuovaparola=nuovaparola+primocarattere
        posizioneparolalista+=1
    nuovalista.append(nuovaparola)
contanuovaparolalista=0

for z in nuovalista:
    nuovaparola=nuovalista[contanuovaparolalista]
    contanuovaparolalista+=1
    print (nuovaparola)

Devo dire che queste sono le soluzioni che gradisco molto. E' migliorabile ma e' chiaramente originale. Alcuni passaggi denotano poca esperienza di programmazione, mancano un po' di trucchi del mestiere, ma si vede che la tenacia di Carmela le ha fatto produrre una sua soluzione al problema che funziona. Ora occorre solo perfezionare, il passaggio di base e' stato fatto.

Nella parte di input delle stringhe (non e' detto debbano essere singole parole), e' consigliabile usare una "etichetta" di terminazione diversa da "no". Se per caso un utente volesse inserire proprio "no" come fa? La mia proposta e' di usare una stringa vuota, Non e' necessario contare il numero di stringhe inserite, lo si trova con len(lista), e' cioe' il numero di elementi della lista. Il while non uscira' mai con il controllo, infatti si incrementa sempre i e n... l'uscita dal ciclo avviene con il break. In questo caso si puo' scrivere "while True:". Non e' necessario inizializzare parola, la variabile verra' creata appena viene assegnato un valore.

La mia proposta per la parte di input delle stringhe e' la seguente:

lista=[]
print("scrivi alcune stringhe una per riga. metti una riga vuota per terminare")
while True:
  parola=input("")
  if parola:
    lista.append(parola)
  else:
    break

Per la parte di elaborazione metto alcuni pensieri per migliorare il codice:

Ogni forma del tipo:

var=0
while var<varmax:
  ...
  var+=1

e' lo schema che viene risolto dall'uso del for insieme a range, la porzione di codice qui sopra equivale esattamente a:

for var in range(varmax):

contacarattere vale sempre x-1, si puo' eliminare la variabile e usare x-1 al posto di contacarattere.

l'unica inizializzazione necessaria nel ciclo while x<lunghezzaparola: e' nuovaparola="". nuovaparola infatti e' la sola variabile che viene letta nel ciclo, quindi ha necessita' di un valore iniziale.

Per le forme a = a + b si puo' usare l'operazione di assegnazione-modifica a += b.

Propongo quindi di semplificare la sezione di elaborazione in (si suppone che tutte le stringhe abbiano la stessa lunghezza, e quindi la lunghezza della prima vale per tutte):

lunghezzaparola=len(lista[0])

nuovalista=[]
for i in range(lunghezzaparola):
  nuovaparola=''
  for parola in lista:
    nuovaparola += parola[i]
  nuovalista.append(nuovaparola)

Per la sezione di output occorre ricordare che la forma "for z in nuovalista;" istanzia z, ordinatamente a ogni elemento della lista, uno dopo l'altro. Non e' quindi necessario usare il contatore contanuovaparolalista.

Si semplifica in:

for nuovaparola in nuovalista:
    print (nuovaparola)



Per l'estensione, e' sufficiente trovare la lunghezza massima delle stringhe. Si sostituisce lunghezzaparola=len(lista[0]) con:

lunghezzaparola=max({len(parola) for parola in lista})

Questa e' una forma che non abbiamo studiato, ma penso sia molto chiara perche' e' dichiarativa.

 {len(parola) for parola in lista}

e' l'insieme delle lunghezze delle "parola" contenute in "lista". Ricalca proprio la scrittura tipica degli insiemi

 X={x tali che...}

A lunghezzaparola viene assegnato il valore massimo fra quelli dell'insieme.

Una volta che abbiamo la lunghezza massima possiamo "allungare" tutte le stringhe perche' raggiugnano la lunghezza massima.

for i in range(len(lista)):
  lista[i] += ' '*(nuovaparola-len(lista[i]))

Ogni elemento di lista viene "allungato" attaccando in coda una stringa composta da tanti spazi pari alla differenza fra la lunghezza massima e la lunghezza dell'elemento considerato.

... ripeto, questo esercizio mi e' piaciuto.

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti