Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [Python] Liste nei dizionari

    Salve a tutti!
    Sto sbattendo la testa con questo problema da giorni

    Il programma che sto implementando legge un file dal pc, riga per riga (sono stringhe).
    Ogni riga la splitta, finche' non trova un carattere bianco (" ") ed ogni elemento ritrovato (ogni parola) va cosi' a comporre la lista1.
    Ad esempio, se il mio primo rigo e' "Ciao come stai?", utilizzando split, mi creo una lista di ['Ciao', 'Come', 'stai?'], con 3 elementi.
    Questa lista la devo inserire all'interno di un dizionario, ed associargli un identificativo (un numero, 1, 2, 3), cossicche' il risultato sia qualcosa del tipo:
    diz = [ lista1: 1, lista2:2, lista3:3, ... ]
    (e qui sorge la prima domanda: ogni elemento presente nella lista1 avra' come valore 1?)
    Successivamente devo leggere un altro file dal pc, sempre riga per riga.
    Splittarle per creare un'altra lista di elementi (di parole) ed infine.. effettuare una "comparazione":
    ovvero se un elemento letto in questo ultimo file e' presente nel file originario, stampa il valore!

    (quindi se nella lista generata dal secondo file letto, ad esempio lista_1, che contiene ['Ciao', 'stai?'], la comparo con lista1, che contiene ['Ciao', 'Come', 'stai?'], mi printa

    1 false(?) 1

    Quando tento di creare una lista utilizzata come chiave mi da errore 'unhashable type: list'

    Grazie per la pazienza!!

  2. #2
    Ma tu vuoi usare la lista come chiave per il dictionary?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Ma tu vuoi usare la lista come chiave per il dictionary?
    Si esatto!
    Perche', praticamente, quando devo andare a comparare i due file, e quindi comparare le due "sottostringhe", devo printare il valore associato alla chiave!
    Altrimenti mica posso printare la chiave associata al valore?!

  4. #4
    Forse sono riuscito a venirne a capo.. in maniera totalmente rustica!
    Effettivamente, vado a modificare ognivolta il dizionario, andando ad inseire la coppia chiave:valore all'interno di una lista database.

    Questo e' quello che ne e' venuto fuori!
    codice:
    truth = open ("ip_juniper_list.log", "r") # apre la "verita'", il file che mi serve per riscontro
    campagna = open ("logrouter.txt", "r") # apre risultato della campagna
    logpython = open ("logpython.txt", "w") # scrive in un log file il risultato della campagna, trmaite dizionario
    #print ip
    value = 1
    db = []
    
    indice = 0
    ipsingolo = " "
    indicedb = 1
    indiceresult = " "
    ipsingolo2 = " "
    #print ip
    
    router = truth.readline()	# legge la prima riga del file (prima?)
    ip = router.split (" ") # creo una lista di ip, utilizzando il .split
    			# mi serve per trovare il singolo ip della lista router, ovvero della singola riga
    
    for router in iter(truth):	# per ogni "router", utilizzando un iteratore in truth
    	ip = router.split (" ")	# creo la mia lista di ip, splittando router
    	for indice in ip:	# per ogni ipsingolo all'interno della lista ip
    		ipsingolo = indice	# ipsingolo = ipsingolo
    		#db.append({ipsingolo:value})	# inserisci la coppia chiave:valore all'interno di un database
    		diz = {ipsingolo:value}			
    		db.append(diz)	
    	value = value +1	# incrementa il valore della chiave
    
    result = campagna.readline()
    ipresult = result.split (" ")
    for result in iter(campagna):
    	ipresult = result.split(" ")
    	for indiceresult in ipresult:
    		ipsingolo2 = indiceresult		
    		while indicedb < len(db):
    			if lambda:(db[indicedb]) == ipsingolo2:	# FUNZIONA MA NON SO COME, MERITO DI LAMBDA!
    				logpython.write("ciaoooo")
    Che ne pensi?

  5. #5
    credo di averlo risolto:

    codice:
    diz = {}
    #print ip
    router = truth.readline()	# legge la prima riga del file (prima?)
    ip = router.split (" ") # creo una lista di ip, utilizzando il .split
    			# mi serve per trovare il singolo ip della lista router, ovvero della singola riga
    for router in iter(truth):	# per ogni "router", utilizzando un iteratore in truth
    	ip = router.split (" ")	# creo la mia lista di ip, splittando router
    	for indice in ip:	# per ogni ipsingolo all'interno della lista ip
    		ipsingolo = indice	# ipsingolo = ipsingolo
    		#db.append({ipsingolo:value})	# inserisci la coppia chiave:valore all'interno di un database
    		diz[ipsingolo] = value		
    		#diz = {ipsingolo:value}			
    		#db.append(diz)	
    	value = value +1	# incrementa il valore della chiave
    che ne pensi?

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Magari MItaly ha capito tutto, io sinceramente non ho capito:
    1) innazitutto cosa devi fare, se avessi fatto fin da subito l'esempio con gli ip invece del "Ciao come stai" si sarebbe magari capito meglio, anche perché poi riporti del codice che fa riferimento a degli ip, io comunque rispiegherei meglio, facendo riferimento ai termini che usi nel codice, truth, campagna, router, ... Altrimenti la spiegazione e il codice rimangono due cose separate.
    2) da quel poco che ho letto non ho capito a cosa ti serva un dizionario: il dizionario ti serve se poi la ricerca la fai per chiave, non ho capito qui quale sarebbe la chiave.

  7. #7
    Originariamente inviato da c0der
    Magari MItaly ha capito tutto, io sinceramente non ho capito:
    1) innazitutto cosa devi fare, se avessi fatto fin da subito l'esempio con gli ip invece del "Ciao come stai" si sarebbe magari capito meglio, anche perché poi riporti del codice che fa riferimento a degli ip, io comunque rispiegherei meglio, facendo riferimento ai termini che usi nel codice, truth, campagna, router, ... Altrimenti la spiegazione e il codice rimangono due cose separate.
    2) da quel poco che ho letto non ho capito a cosa ti serva un dizionario: il dizionario ti serve se poi la ricerca la fai per chiave, non ho capito qui quale sarebbe la chiave.
    Effettivamente mi sono espresso male, ma comunque "la base" non cambia, sia che si tratti di ip, sia che si tratti di "parole": tratto gli ip come semplici stringhe di caratteri!

    2) il dizionario mi serve perche' quando comparo i due file, devo ricercare il valore associato alla chiave, il cui valore e' un numero identificativo (1, 2, 3, ...) e la chiave associata invece e' l'ip (ovvero una stringa): se la stringa del II file e' presente nel I file (nel dizionario), stampami il valore associato alla chiave!

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Originariamente inviato da Gallagher
    2) il dizionario mi serve perche' quando comparo i due file, devo ricercare il valore associato alla chiave, il cui valore e' un numero identificativo (1, 2, 3, ...) e la chiave associata invece e' l'ip (ovvero una stringa): se la stringa del II file e' presente nel I file (nel dizionario), stampami il valore associato alla chiave!
    I due files sono questi?
    ip_juniper_list.log
    logrouter.txt

    Quello che chiami numero identificativo è in ip_juniper_list.log?
    Se sì come è fatta una riga che leggi in ip_juniper_list.log? e le righe sono tutte uguali o la prima è diversa?
    e come è fatta una riga in logrouter.txt?

  9. #9
    Originariamente inviato da c0der
    I due files sono questi?
    ip_juniper_list.log
    logrouter.txt

    Quello che chiami numero identificativo è in ip_juniper_list.log?
    Se sì come è fatta una riga che leggi in ip_juniper_list.log?
    e come è fatta una riga in logrouter.txt?
    In realta' i file sono 3, ma anziche' fare "print" mi basta fare "write".
    Nel file ip_juniper_list.log, ci sono 100 ip (ad esempio) inseriti su righe diverse:
    nella prima riga 3 ip
    nella seconda 5
    nella terza 1
    nella quarta 12
    e cosi' via!

    nel file logrouter.txt invece ci sono altri indirizzi IP, per la maggior parte UGUALI al file ip_juniper_list.

    ogni riga del file ip_juniper_list la tratto come una "lista".
    Tramite lo "split", divido questa lista di IP in singoli IP.
    Ad ogni singolo IP devo associare un valore (numero identificativo), UGUALE per ogni riga (ovvero uguale per lista di IP).

    Nel 3' file poi, tramite la comparazione (ovvero "il singolo IP letto in logrouter.txt e' presente in ip_juniper_list? Se si', printami in un 3' file il valore associato a quell'indirizzo, se no printami false")

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Originariamente inviato da Gallagher
    Tramite lo "split", divido questa lista di IP in singoli IP.
    Ad ogni singolo IP devo associare un valore (numero identificativo), UGUALE per ogni riga (ovvero uguale per lista di IP).
    Qui scusa ma non si capisce veramente cosa vuoi dire...

    Perché usare un dizionario abbia senso ci vogliono delle coppie chiave/valore. Puoi per favore scrivere meglio che puoi qual'è la chiave e qual'è il valore?

    Sembra che per chiave intendi il numero di riga... ma poi scrivi "UGUALE per ogni riga".. cosa significa? Vuol dire che una riga si può ripetere allora non la consideri 2 volte?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.