Manipolazione files di testo,liste,dizionari - Aiuto per esercizio -

di il
3 risposte

Manipolazione files di testo,liste,dizionari - Aiuto per esercizio -

Salve a tutti,
sono un neofita ovviamente.
Ho trovato questo esercizio su un testo che sto studiando,qualcuno mi aiuta a risolverlo?

"Script che indicizza tutti i file di una specifica direcotry fornita da utente.
Deve costruire un dizionario in cui le chiavi sono tutte le parole univoche di tutti i file
(descritte dall’espressione regolare r"w+" , trattando le parole senza distinguere fra lettere maiuscole e minuscole),
e il valore di ogni voce e' una lista di nomi di file che contengono tale parola.

Per esempio,se la parola aloha è menzionata nei file early-internet.dat e hawaiian-travel.txt,
il dizionario dovrà contenere la voce:
{..., 'aloha': ['early-internet.dat', 'hawaiian-travel.txt'],...}."

Non so bene come collegare la lista di parole univoche con le chiavi del dizionario ed associare la lista dei files a cui appartengono.
Per ora ho fatto questo:

for root, dirs, files in os.walk(path): 

    for name in files: 

        # Apro file
        file = open(os.path.join(path,name))

        # Divido il file in una lista di parole
        wordss = re.findall(r"\w+",file.read())

        # Elimino dalla lista di parole i duplicati
        wordss = list(set(wordss))

        # Ottengo un dizionario dalla lista parole non duplicare del file
        diz = dict(enumerate(wordss))

        # Creo un dizionario con le keys che corrispondono ai values di diz e con values nome file usato
        for v in diz.values():
            dv=name
Adesso ho n dizionari comporti da chiave=parola_univoca valore=nome_file.

Come faccio ad unire questi N dizionari in un unico dizionario strutturato come spiegato?

Cioè con chiave = parola_univoca valore = lista_file_di_appartenenza ?

HELP

Grazie

3 Risposte

  • Re: Manipolazione files di testo,liste,dizionari - Aiuto per esercizio -

    Premesso che sicuramente ci sono soluzioni migliori, io la risolverei così:
    finaldict=dict()
    for root, dirs, files in os.walk(path):
    
        for name in files:
    
            print(name)
    
            # Apro file
            file = open(os.path.join(path,name))
    
            # Divido il file in una lista di parole
            wordss = re.findall(r"\w+",file.read())
    
            # Elimino dalla lista di parole i duplicati
            wordss = list(set(wordss))
    
            # Ottengo un dizionario dalla lista parole non duplicare del file
            #diz = dict(enumerate(wordss))
    
            # Creo un dizionario con le keys che corrispondono ai values di diz e con values nome file usato
            #for v in diz.values():
            #    dv=name
    
            for w in wordss:            # ciclo su tutte le parole
                if w not in finaldict:      # se la parola non è presente nel dizionario
                    finaldict[w]=set([name])     # la aggiungo
                else:                   # se la parola è già presente
                    finaldict[w].add(name) # aggiorno l'insieme
    
    In pratica creo un unico dizionario all'inizio (l'ho chiamato finaldict); questo dizionario conterrà dei set con i nomi dei file di modo che una volta ottenuta la lista delle parole in un determinato file vado ad aggionare il dizionario in questo modo:
    - creando il nuovo set se la chiave non esiste
    - aggiungedo il nome di file al set se la chiave esiste.
    Nota: per creare il set con il nome del file sono stato costretto a passare per una lista (ho fatto [name]) altrimenti mi creava un set con i caratteri del nome di file.
  • Re: Manipolazione files di testo,liste,dizionari - Aiuto per esercizio -

    Ciao,
    grazie per il suggerimento.
    La tua ideo funziona benissimo.
    Unica cosa che ho cambiato,ho usato la lista invece del set:
         for w in wordss: # ciclo su tutte le parole
                if w not in finaldict: # se la parola non è presente nel dizionario
                    finaldict[w]=list([name]) # la aggiungo
                else: # se la parola è già presente
                    finaldict[w].append(name) # aggiorno la lista
    In questo modo l'output mi viene come richiesto dall'esercizio.
    Grazie ancora.
  • Re: Manipolazione files di testo,liste,dizionari - Aiuto per esercizio -

    Ottimo, nel dizionario avevo utilizzato dei set perchè volevo evitare di ripetere più volte lo stesso nome di file: mi era sfuggito che a questo ci avevi già pensato, in wordss non abbiamo doppioni e quindi si può creare direttamente la lista senza rischio di ripetere il nome.
Devi accedere o registrarti per scrivere nel forum
3 risposte