Notizia:
  • Rilasciata Ubuntu 14.04 LTS Trusty Tahr. Per ottenerla, visitate questa pagina oppure visualizzate la dimostrazione.
  • È uscito il numero 16 della Newsletter italiana di Ubuntu. Lo trovate a questo indirizzo.
  • È uscito il numero 79 di Full Circle Magazine in italiano. Lo trovate a questo indirizzo.

Dizionario di Python

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Dizionario di Python

Messaggioda -Massimo- » giovedì 3 maggio 2012, 23:33

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 !
-Massimo- Non specificato
Prode Principiante
 
Messaggi: 3
Iscrizione: aprile 2012
Località: Padova (San Giorgio in Bosco)

Re: Dizionario di Python

Messaggioda Zoff » giovedì 3 maggio 2012, 23:36

È 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 [code]
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Vuoi applicare il [Risolto] semplicemente alle tue discussioni? Prova: viewtopic.php?f=70&t=548821
Vuoi integrare il forum con Unity? Prova: viewtopic.php?f=70&t=562887
Avatar utente
Zoff Non specificato
Moderatore Globale
Moderatore Globale
 
Messaggi: 29346
Iscrizione: ottobre 2007
Località: Romagna!!!
Distribuzione: Ubuntu 12.04
Desktop: Unity e Gnome Shell

Re: Dizionario di Python

Messaggioda crap0101 » venerdì 4 maggio 2012, 0:22

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
Avatar utente
crap0101 Maschile
Rampante Reduce
Rampante Reduce
 
Messaggi: 6979
Iscrizione: ottobre 2007
Località: TO
Distribuzione: trisquel
Desktop: LXDE

Re: Dizionario di Python

Messaggioda -Massimo- » venerdì 4 maggio 2012, 15:13

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 !
-Massimo- Non specificato
Prode Principiante
 
Messaggi: 3
Iscrizione: aprile 2012
Località: Padova (San Giorgio in Bosco)

Re: Dizionario di Python

Messaggioda Bakuriu » sabato 5 maggio 2012, 8:07

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.
Bakuriu Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1153
Iscrizione: ottobre 2009
Distribuzione: Kubuntu 12.04 LTS - x86_64
Desktop: KDE4

Re: [RISOLTO]Dizionario di Python

Messaggioda Aladino70 » sabato 5 maggio 2012, 23:10

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[b]=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
Aladino70 Maschile
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 264
Iscrizione: aprile 2012
Località: Palermo
Distribuzione: 12.04 LTS 64bit
Desktop: Unity

Re: Dizionario di Python

Messaggioda Alkatron » sabato 5 maggio 2012, 23:48

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[b]=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
Alkatron Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1010
Iscrizione: aprile 2009
Distribuzione: debian wheezy 64

Re: Dizionario di Python

Messaggioda Aladino70 » domenica 6 maggio 2012, 0:19

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?
Avatar utente
Aladino70 Maschile
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 264
Iscrizione: aprile 2012
Località: Palermo
Distribuzione: 12.04 LTS 64bit
Desktop: Unity

Re: Dizionario di Python

Messaggioda Bakuriu » domenica 6 maggio 2012, 8:56

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[b]=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"!
Bakuriu Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1153
Iscrizione: ottobre 2009
Distribuzione: Kubuntu 12.04 LTS - x86_64
Desktop: KDE4

Re: Dizionario di Python

Messaggioda Aladino70 » lunedì 7 maggio 2012, 0:06

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 Maschile
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 264
Iscrizione: aprile 2012
Località: Palermo
Distribuzione: 12.04 LTS 64bit
Desktop: Unity

Re: Dizionario di Python

Messaggioda Aladino70 » lunedì 7 maggio 2012, 0:48

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.
Avatar utente
Aladino70 Maschile
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 264
Iscrizione: aprile 2012
Località: Palermo
Distribuzione: 12.04 LTS 64bit
Desktop: Unity

Re: Dizionario di Python

Messaggioda Bakuriu » lunedì 7 maggio 2012, 11:04

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:
[code ] if __name__ == '__main__': [/code] 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()
Bakuriu Non specificato
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1153
Iscrizione: ottobre 2009
Distribuzione: Kubuntu 12.04 LTS - x86_64
Desktop: KDE4


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 6 ospiti