Dizionario di Python

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
-Massimo-
Prode Principiante
Messaggi: 3
Iscrizione: lunedì 30 aprile 2012, 13:23
Località: Padova (San Giorgio in Bosco)
Contatti:

Dizionario di Python

Messaggio da -Massimo- »

Salve, sono nuovo, mi chiamo Massimo ed ho 14 anni. Da poco ho iniziato a programmare e devo dire che il Python è il più facile rispetto ad altri.
Il mio problema risale in un programma che usa un dizionario: QUANDO RIAVVIO IL PROGRAMMA NON RICORDA PIù I RECORD INSERITE PRECEDENTEMENTE. :incazz:

ESEMPIO.

avvio il programma, aggiungo in nome, esso è presente, ma se riavvio il programma ritrovo quelli già scritti nel dizionario

# programma dizionario.py

Codice: Seleziona tutto

diz = {"massimo":"tel: 99999999","alberto":"tel: 33333333","simone":"tel: 02416448564565"}

import time

while (1):

	print "******************************************************************"
	print " * cerca nome",
	print "* elenca nomi",
	print "* aggiungi nome",
	print "* elimina nome",
	print "* esci"
	print "******************************************************************"
	print

	a=raw_input("Inserire comando\t")
	if a=="cerca nome":
		try:
			a=raw_input("Inserire nome\n")
			print
			print diz[a]
			time.sleep(2.2)
			print '\n' *50
		except:
			print "nome errato o non presente"
			time.sleep(2.2)
			print '\n' *50

	elif a=="elenca nomi":
		print
		print diz.keys()
		time.sleep(2.2)
		print '\n' *50

	elif a=="aggiungi nome":
		b=raw_input("Inserire key\t")
		c=raw_input("Inserire value\t")
		diz [b]=[c]
		time.sleep(1)
		print "nome aggiunto"
		time.sleep(2.2)
		print '\n' *50
	elif a=="elimina nome":
		v=raw_input("Inserire chiave da eliminare\t")
		del diz[v]
		print "Nome eliminato!"
		time.sleep(2.2)
		print '\n' *50
	elif a=="esci":
		exit()
	else:
		print "Errore!"
		time.sleep(2.2)
		print '\n' *50
Ultima modifica di -Massimo- il venerdì 4 maggio 2012, 15:12, modificato 2 volte in totale.
import time
# Nessun commento, sta importando un brutto tempo !

Il Python lo adoro. Sopratutto quando lo indossa Linux Ubuntu XD

Ma anche a Windows XP lascio un bel bacione !
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Dizionario di Python

Messaggio da Zoff »

È normale, se vuoi che se le ricordi devi salvare il dizionario su file e ricaricarlo all'avvio.

Modifica anche il messaggio precedente aggiungendo i tag
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Dizionario di Python

Messaggio da crap0101 »

butta un occhio qua: http://docs.python.org/library/pickle.h ... ule-pickle

ah... usa il tag

Codice: Seleziona tutto

codice
quando posti codice, altrimenti perde la formattazione.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
-Massimo-
Prode Principiante
Messaggi: 3
Iscrizione: lunedì 30 aprile 2012, 13:23
Località: Padova (San Giorgio in Bosco)
Contatti:

Re: Dizionario di Python

Messaggio da -Massimo- »

crap0101 ha scritto:butta un occhio qua: http://docs.python.org/library/pickle.h ... ule-pickle

ah... usa il tag

Codice: Seleziona tutto

codice
quando posti codice, altrimenti perde la formattazione.
FATTO !!!!
import time
# Nessun commento, sta importando un brutto tempo !

Il Python lo adoro. Sopratutto quando lo indossa Linux Ubuntu XD

Ma anche a Windows XP lascio un bel bacione !
Bakuriu
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1156
Iscrizione: venerdì 23 ottobre 2009, 23:43
Desktop: KDE4
Distribuzione: Kubuntu 12.04 LTS - x86_64

Re: Dizionario di Python

Messaggio da Bakuriu »

Secondo me il metodo più rapido per fare quello che vuoi è utilizzare il modulo "shelve".
A “shelf” is a persistent, dictionary-like object. The difference with “dbm” databases is that the values (not the keys!) in a shelf can be essentially arbitrary Python objects — anything that the pickle module can handle. This includes most class instances, recursive data types, and objects containing lots of shared sub-objects. The keys are ordinary strings.
Avatar utente
Aladino70
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: domenica 1 aprile 2012, 22:35
Desktop: Unity
Distribuzione: 15.10 64bit
Località: Palermo

Re: [RISOLTO]Dizionario di Python

Messaggio da Aladino70 »

Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie
Ultima modifica di Aladino70 il lunedì 7 maggio 2012, 0:49, modificato 1 volta in totale.
Avatar utente
Alkatron
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1248
Iscrizione: giovedì 16 aprile 2009, 13:26
Distribuzione: debian jessie 64
Contatti:

Re: Dizionario di Python

Messaggio da Alkatron »

Aladino70 ha scritto:Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie

Codice: Seleziona tutto

import shelve
def shvsave(_dict, _name):
    db = shelve.open(_name,"n")
    db['dati'] = _dict
    db.close()
def shvread(_name):
    db = shelve.open(_name,"r") 
    _ret=db['dati']
    db.close()
    return _ret
def main():
    mydict = {}
    b = ''
    while b != "exit":
        b=raw_input("Chiave... ")
        if b =='save':
            shvsave(mydict, 'shvfile.shv')
            break
        elif b =='read':
            mydict=shvread('shvfile.shv')
            for key, val in mydict.iteritems():
                print '%s - %s' % (key,val)
            break    
        c=raw_input("Valore... ")
        mydict[b] = c
    print b
    return 0
if __name__ == '__main__':
	main()
Se a Chiave dai
'exit' esce
'save' salva
'read' legge i dati precedentemente salvati
Avatar utente
Aladino70
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: domenica 1 aprile 2012, 22:35
Desktop: Unity
Distribuzione: 15.10 64bit
Località: Palermo

Re: Dizionario di Python

Messaggio da Aladino70 »

Scusa ma per me è importantissimo. Sono un novizio,entusiasta ma novizio. In generale mi è chiara ma: key, val, _name, 'dati',_dict,_ret, vado nel panico!
key e value sonno le variabili ma se sono d e c. In poche parole io dopo mydict, b e c non saprei che mettere. Si vede che sono confuso o sbaglio?
Bakuriu
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1156
Iscrizione: venerdì 23 ottobre 2009, 23:43
Desktop: KDE4
Distribuzione: Kubuntu 12.04 LTS - x86_64

Re: Dizionario di Python

Messaggio da Bakuriu »

Alkatron ha scritto:
Aladino70 ha scritto:Il mio problema è che non ho mica capito come utilizzare shelve, ovvero io ci ho provato ma non credo si faccia così, avresti un'esempio partendo da un dizionario semplice a={"":"",... a=c etc... in poche parole salvare il dizionario senza che si cancelli. Grazie

Codice: Seleziona tutto

import shelve
def shvsave(_dict, _name):
    db = shelve.open(_name,"n")
    db['dati'] = _dict
    db.close()
def shvread(_name):
    db = shelve.open(_name,"r") 
    _ret=db['dati']
    db.close()
    return _ret
def main():
    mydict = {}
    b = ''
    while b != "exit":
        b=raw_input("Chiave... ")
        if b =='save':
            shvsave(mydict, 'shvfile.shv')
            break
        elif b =='read':
            mydict=shvread('shvfile.shv')
            for key, val in mydict.iteritems():
                print '%s - %s' % (key,val)
            break    
        c=raw_input("Valore... ")
        mydict[b] = c
    print b
    return 0
if __name__ == '__main__':
	main()
Se a Chiave dai
'exit' esce
'save' salva
'read' legge i dati precedentemente salvati
Ma che senso ha usare shelve se poi di fatto non lo sfrutti? Per fare una cosa di questo tipo pickle sarebbe più consono.
Se utilizzi shelve devi utilizzarne la sua interfaccia dict-like:

Codice: Seleziona tutto

def main():
    mydict = shelve.open('db.shelve', 'c')   #c = apri database per lettura + scrittuare, e crealo se non esiste
    while True:
        b=raw_input("Chiave... ")
        if b =='exit':
            mydict.sync()    #salva i risultati ed esce
            break
        elif b == 'save':
            mydict.sync()
            continue
        c=raw_input("Valore... ")
        mydict[b] = c
    mydict.close()
if __name__ == '__main__':
	main()
edit:
comunque il codice postato in precedenza non funzionava perchè apriva il db con la flag "n" che crea sempre un nuovo db.
Bisogna usare "c"!
Avatar utente
Aladino70
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: domenica 1 aprile 2012, 22:35
Desktop: Unity
Distribuzione: 15.10 64bit
Località: Palermo

Re: Dizionario di Python

Messaggio da Aladino70 »

scusa ma continua a non funzionarmi...sono io che non riesco:
tolgo def main(): ed inserisco il codice direttamente
inoltre elimino if__name__=="__main__": e main() perchè non capisco a che servono.
Adesso il programma mi salta a piè uniti tutto il codice e salta alla fine ma perchè?
Se vuoi ti spiego meglio: è un prog di intelligenza artificiale che sfrutta un dizionario.
Ho provato ad inserire all'interno del mio codice le righe di codice che mi hai suggerito e salta.
Che faccio? di posto tutto il programma?
Avatar utente
Aladino70
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 306
Iscrizione: domenica 1 aprile 2012, 22:35
Desktop: Unity
Distribuzione: 15.10 64bit
Località: Palermo

Re: Dizionario di Python

Messaggio da Aladino70 »

Eureka!!! Ci sono riuscito e tutto funziona perfettamente. Grazie sinceramente a tutti.
Ho fatto così:

Codice: Seleziona tutto

b="inizio"
while b!="":
      mydict = shelve.open("db.shelve","c")
      voce.Speak("Chiedimi qualcosa")
      b=raw_input("Chiedimi qualcosa... ")
      if b=="exit":
        mydict.sync()
        break
      elif b =="save":
         mydict.sync()
         continue
      elif mydict.has_key(b):
        print mydict[b]
        voce.Speak(mydict[b])
      else:
         voce.Speak("Non capisco, cosa DovrEi Rispondere alla Domanda...")
         c=raw_input("Non capisco, cosa dovrei rispondere alla domanda..."+b)
         mydict[b]=c
         mydict.close()
         print"La risposta è ",c,"giusto?",nome
         voce.Speak("La risposta è")
         voce.Speak(c)
         voce.Speak("Giusto?")
         voce.Speak(nome)
era semplice anche se mi ha fatto mangiare bug in quantità. Grazie.
Bakuriu
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1156
Iscrizione: venerdì 23 ottobre 2009, 23:43
Desktop: KDE4
Distribuzione: Kubuntu 12.04 LTS - x86_64

Re: Dizionario di Python

Messaggio da Bakuriu »

Aladino70 ha scritto:scusa ma continua a non funzionarmi...sono io che non riesco:
tolgo def main(): ed inserisco il codice direttamente
inoltre elimino if__name__=="__main__": e main() perchè non capisco a che servono.
Adesso il programma mi salta a piè uniti tutto il codice e salta alla fine ma perchè?
Se vuoi ti spiego meglio: è un prog di intelligenza artificiale che sfrutta un dizionario.
Ho provato ad inserire all'interno del mio codice le righe di codice che mi hai suggerito e salta.
Che faccio? di posto tutto il programma?
A me funziona.
Comunque è una pessima idea mettere del codice a livello del modulo. Ti potresti chiedere perchè... la risposta è semplice: ti potrebbe sempre venir voglia di riutilizzare quel codice in un altro programma, ma se cerchi di importare il modulo il codice viene eseguito. Se invece utilizzi una funzione main e quell'if sei a posto.

In pratica:

Codice: Seleziona tutto

 if __name__ == '__main__': 
Significa: "se questo modulo è stato eseguito e non importato".
È una convenzione che viene utilizzata da tutti, quindi comincia a seguirla anche tu.

Per quanto riguarda il tuo codice, io cambierei un sacco di cose:

1) Tu riapri il dizionario shelve ad ogni ciclo! ma nel momento in cui questo dizionario conterrà migliaia di valori vedrai che questa riapertura si noterà.
Visto che è inutile aprilo al di fuori del ciclo.

2) Ogni volta usi questo "voce.Speak" e raw_input oppure print e "voce.Speak".. ma a questo punto sarebbe molto più chiaro crearsi una funzione a parte, tipo "output" e "get_input".

3) Ti sconsigio di utilizzare "has_key". Utilizza l'operatore "in"(al posto di "mydict.has_key(b)" usa "b in mydict")


Sostanzialmente io modificherei il tutto così:

Codice: Seleziona tutto

def output(msg, voce=None):
    '''Prints some output text.
    If *voce* is provided than it is also used to send some
    sound output.
    '''
    
    print msg
    if voce is not None:
        voce.Speak(msg)

def get_input(prompt, voce=None, end=''):
    '''Return an input string.
    If *voce* is provided the prompt is also spoken.
    '''
    
    if voce is not None:
        voce.Speak(prompt)
    return raw_input(prompt + end)


def main():
    mydict = shelve.open('db.shelve', 'c')

    while True:
        question = get_input('Chiedimi qualcosa', voce,'...')
        if question == "exit":
            break
        elif question == "save":
            mydict.sync()
            continue
        elif question in mydict:
            output(mydict[question], voce)
        else:
            answer = get_input('Non capisco, cosa dovrei rispondere alla domanda...',
                               voce, question)
            mydict[question] = answer
            mydict.sync()
            output('La risposta è %s giusto?' % answer, voce)
    mydict.close()
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti