Domanda problema con programma python

Stato
Discussione chiusa ad ulteriori risposte.

TheMethodMan

Utente Bronze
17 Ottobre 2016
14
4
1
32
Quello che dovrei riuscire a fare è questo:
'''Scrivere una funzione parole(a,b,txt) che ritorna una lista che all'indice i
ha una stringa contenente tutte le parole presenti nella linea i della stringa
di input txt di lunghezza almeno a ed al piu' b.
Per parola si intende una sequenza di caratteri alfabetici (maiuscoli o minuscoli)
di lunghezza massimale. Nella stringa in posisione i della lista di output, le
parole sono separate da un singolo spazio e devono apparire nello stesso
ordine con cui appaiono nella linea i di txt. Se la linea non ha parole di
lunghezza tra a e b, la stringa corrispondente nella lista di output e' la stringa
vuota.
AVVERTENZE: non usare caratteri non ASCII, come le lettere accentate;
non usare moduli che non sono nella libreria standard.
'''
Io per ora sono arrivato a questo punto:
Python:
def parole(a,b,txt):
    '''Implementare la funzione qui'''
    # elimino i simboli non necessari
    txt = txt.replace(',', '')
    txt = txt.replace('.', '')
    txt = txt.replace('-', '')
    txt = txt.replace(';', '')
    txt = txt.replace(':', '')
    txt = txt.replace('_', '')
    txt = txt.replace('!', '')
    txt = txt.replace('?', '')
    txt = txt.replace('^', '')
    txt = txt.replace('(', '')
    txt = txt.replace(')', '')
    txt = txt.replace('"', '')
    txt = txt.replace("'", '')
    ris = []
    ris2 = ''
    # divido il testo in righe
    righe = txt.splitlines
    for r in righe:
        # divido le righe in parole e seleziono solo quelle della lunghezza corretta
        parole = r.split()
        for p in parole:
            if a <= len(p) <= b:
                ris2 = ris2 + ' ' + p
            else:
                ris2 = ris2
        # se la stringa risultante inizia con uno spazio elimino lo spazio
        if ris2[0] == ' ':
            ris2 = '' + ris2[1:]
        # aggiungo la stringa alla lista
        ris = ris + list(ris2)
        ris2 = ''
    return ris

Quando provo ad usare il programma mi manda messaggi del genere:
>>> parole(3,5,'''ciao a tutti''')
Traceback (most recent call last):
File "<pyshell#96>", line 1, in <module>
parole(3,5,'''ciao a tutti''')
File "<pyshell#95>", line 21, in parole
for r in righe:
TypeError: 'builtin_function_or_method' object is not iterable

Se è sbagliato il procedimento sapreste consigliarmene uno nuovo?
 
Quell'errore è dovuto al fatto che str.splitlines() è un metodo, quindi devi usare le parentesi tonde per chiamarlo. Oltre a questo ti segnalo che l'else lo puoi anche rimuovere, se vuoi rimuovere gli spazi all'inizio e alla fine di una parola puoi utilizzare il metodo str.strip() e per aggiungere una elemento ad una lista puoi utilizzare list.append().

Per il resto direi che funziona, lo puoi considerare più o meno corretto in base alla tua interpretazione dei requisiti:
Python:
def parole(a,b,txt):
    '''Implementare la funzione qui'''
    # elimino i simboli non necessari
    txt = txt.replace(',', '')
    txt = txt.replace('.', '')
    txt = txt.replace('-', '')
    txt = txt.replace(';', '')
    txt = txt.replace(':', '')
    txt = txt.replace('_', '')
    txt = txt.replace('!', '')
    txt = txt.replace('?', '')
    txt = txt.replace('^', '')
    txt = txt.replace('(', '')
    txt = txt.replace(')', '')
    txt = txt.replace('"', '')
    txt = txt.replace("'", '')
    ris = []
    ris2 = ''
    # divido il testo in righe
    righe = txt.splitlines()
    for r in righe:
        # divido le righe in parole e seleziono solo quelle della lunghezza corretta
        parole = r.split()
        for p in parole:
            if a <= len(p) <= b:
                ris2 = ris2 + ' ' + p
        # se la stringa risultante inizia con uno spazio elimino lo spazio
        ris2 = ris2.strip()
        # aggiungo la stringa alla lista
        ris.append(ris2)
        ris2 = ''
    return ris


Ti propongo anche la mia soluzione:
Python:
import string, re
def parole(a,b,txt):
    cleantext = re.sub(r'[^a-zA-Z\n]', ' ', txt)
    words_per_line = [ line.split() for line in cleantext.splitlines() ]
    return [ ' '.join(filter(lambda word: a <= len(word) <= b, line)) for line in words_per_line ]
 
Ultima modifica:
Grazie i tuoi consigli mi sono stati molto utili.

Per quanto riguarda la tua soluzione sembra interessante ma non mi va bene per due ragioni:
1) non posso importare nulla
2) il codice scritto in così poche righe mi fa incrociare gli occhi:asd:
 
Stato
Discussione chiusa ad ulteriori risposte.