Forum >> Principianti >> estrazioni casuali

Pagina: 1 2 Avanti

Ciao a tutti, qualcuno ha voglia di darmi una mano? downey nel libro "come pensare da informatico" a pagina 132 dice che la funzione qua sotto può essere "ovviamente" riscritta costruendo la lista una sola volta e poi facendo estrazioni multiple, sarà ovvio per lui ma per me un pò meno... Grazie.




import random




def parola_caso(h):

"""h: dict

"""

t = []

for parola, freq in h.items():

t.extend(parola * freq)

return random.choice(t)




Dammi il link alla pagina, secondo me hai fatto un errore di copiatura e/o di comprensione.

Grazie dell'interessamento, quando ho pubblicato il codice è stato riformattato.. a dirtela tutta ho scaricato il pdf, ho allegato uno screenshot, che sappia io c'è la versione interattiva su
https://github.com/AllenDowney/ThinkPythonItalian/blob/master/thinkpython_italian.pdf
Grazie ancora boss!

Allegati
Non avendo visto il dizionario di partenza, credevo ci fosse un errore di "comprensione", ed invece è tutto ok.

L'autore ti sta spiegando che in quel codice ricrei sempre la lista, mentre potresti creare una sola lista, una volta sola, e poi effettuare le varie estrazioni, alternativamente creando delle liste dove mettere parole ed occorrenze (usando lista.append() magari) e poi eseguire tutte le tue operazioni. Sì perché la lista, specie con fonti molto ampie, è troppo grande e del tutto inefficiente, sarebbe meglio sintetizzare i dati magari in sole due liste.

Arrivato a questo punto del libro hai tutto il bagaglio tecnico per eseguire questo tipo di operazioni (ho verificato prima di scrivertelo). Andando un po' avanti nella stessa sezione, ti suggerisce di modificare il dizionario, utilizzando chiavi e valori in modo intelligente, anzi lo definirei più appropriato.

Insomma inizia a costruire qualcosa, possiamo ragionarci sopra se non ti riesce, anche se sono sicuro che con un po' di prove ci riesci senza grossi problemi.

Cya

Grazie per la stima, ma purtroppo credo di non meritarmela.. sul fatto che il metodo extend ricrei la lista e sia poco produttivo non avevo dubbi, sul come creare una lista una volta sola partendo da un dizionario d la soluzione dovrebbe essere:

list(d.items())

o per effettuare un estrazione direttamente

for a, b in d.items():

per creare velocemente delle liste di chiavi e valori di un dizionario si dovrebbe fare rispettivamente:

list(d) oppure list(d.key())

list(d.values())

il problema è come riconciliare questo con la richiesta di rendere l'estrazione casuale proporzionale alla frequenza tramite la funzione choice del modulo random..




ho meditato un pò e sono arrivato alle 3 possibili soluzioni sotto riportate, funzionano ma non sono convinto soddisfino quanto richiesto dall'autore..





import random




def parola_caso(h):

lista = []

for m, n in h.items():

for i in range(n):

lista.append(m)

return random.choice(lista)




se non ho capito male il metodo append è più veloce di extend perché aggiunge senza sovrascrivere




qua sotto ho usato le stringhe




def parola_caso(h):

stringa = ''

for m, n in h.items():

stringa += (m * n)

t = list(stringa)

return random.choice(t)




def parola_caso(h):

lista = []

for m, n in h.items():

a = list(m * n)

lista += a

return random.choice(lista)





Perdona la mia manifesta incapacità, ma evidentemente devo avere un problema di prospettiva.

Grazie per la pazienza.
Guarda, secondo me hai ridotto il tempo di esecuzione (sicuramente con la prima versione) e puoi ritenerti soddisfatto ed andare oltre.

Al limite, con alcune competenze future, potrai tornarci sopra e farlo in un terzo del tempo. :O

Cya

P.S. Non mi ricordo in che ambiente sei, potresti usare anche time quando esegui uno script, così da renderti immediatamente conto dei tempi di esecuzione.

Immaginando un file che ti saluta, potresti avere una cosa del genere:
$ time python nome_file.py
Hello World

real	0m0.017s
user	0m0.010s
sys	0m0.007s
Grazie tante Daniele! ho apprezzato molto la tua pazienza!
Sono in ambiente windows 10. Hai ragione mi era sfuggito, potrei usare il modulo time di cui l'autore aveva parlato in precedenza, però se non ho inteso male l'esempio che hai fatto tu è riferito ad un comando da usare in ambiente linux (powershell non mi permette quel comando).

Credo dovrei scrivere nel file di script:




import time




# tralascio la definizione della funzione parola_caso(h)




t= time.time()




parola_caso(h)




print(time.time()-t)




E' corretto? esisteranno sicuramente altri comandi migliori ma al momento non gli ho ancora visti... buttando l'occhio sulla funzione help dell'interprete non ho trovato nulla...

Grazie ancora e buona serata.
Sì, è uno dei circa mille modi che puoi usare, utilizzando librerie come time, datetime, timeit, etc...

Comunque hai colto il concetto. :ok:

Cya
Super brillante Daniele! ti posso ancora chiedere una piccola curiosità? in merito all'esempio di prima legato all'utilizzo della funzione time.time(), se eseguo questa operazione tramite uno script il tempo di esecuzione indicato è leggermente inferiore a quello che ottengo eseguendo la stessa operazione ma direttamente sull'interprete python, perché?



script





PS C:\users\onedrive\Documenti> py esempio.py

0.34497570991516113





interprete




# tralascio tutti le istruzioni che avevo indicato prima e riporto solo l'ultima riga di codice

>>> print(time.time()-t)


0.36597609519958496





Grazie mille.
Beh dai, non saranno mai perfettamente uguali, ci sono svariati aspetti che incidono sull'esecuzione di un script.

Avrai comunque risultati relativamente simili, come nel tuo caso.

Cya


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.