Forum
>>
Principianti
>>
uso avanzato della funzione itertools.product
Pagina: 1
Esegui il login per scrivere una risposta.
Pagina: 1
Scritto da ValerioP |
2016-06-18 12:49:04 - uso avanzato della funzione itertools.product
|
Salve a tutti, mi scuso in anticipo se la mia domanda può risultare ovvia per qualcuno, ma sono veramente agli inizi con Python e a volte alcune finezze di questo linguaggio mi sfuggono. Vi spiego il mio problema:
Devo realizzare un algoritmo di questo tipo: for x in range (0,25): for y in range (x,15): print(x,y)ma ho necessità che sia composto di molteplici cicli for innestati uno nell'altro. quindi ho deciso di utilizzare la funzione product di itertools: from itertools import product for x,y in product(range(0,25), range(x,15)): print (x,y)però così non funziona, in quanto ovviamente la "x" in range(x,9) non la riconosce e mi segnala l'errore. Domanda: come posso creare un ciclo "product" che faccia ciò che fa il ciclo "for" di cui sopra ? e inoltre, come posso attribuire delle variabili al posto di "x,y" e al posto di "range(0,4,range(x,9)" in modo da poter variare a piacimento il numero di iterazioni ? un esempio di cosa vorrei fare: for "numero x di variabili" in product(numero n di range): print ("lista di variabili")Grazie dell'aiuto ! |
|
Scritto da Daniele aka Palmux |
2016-06-18 17:41:34 - Re: uso avanzato della funzione itertools.product
|
Ciao Valerio, non mi è chiaro cosa vuoi ottenere con itertools.product().
Immaginiamo di aver due liste: >>> l1 = [1,2,3] >>> l2 = [4,5,6]Utilizzando product() otteniamo le interazioni possibili tra queste due liste: >>> from itertools import product >>> list(product(l1,l2)) [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]Questo è del tutto equivalente a: >>> [(x,y) for x in l1 for y in l2] [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]Ti è più chiaro ora? Cya |
|
Scritto da ValerioP |
2016-06-18 19:02:35 - Re: uso avanzato della funzione itertools.product
|
Ciao Daniele, grazie del chiarimento.
Si hai ragione forse non mi sono spiegato bene. Questo è il concetto di base: for a in range (0,10): for b in range (a,10): print(a,b)questi cicli "for" innestati uno nell'altro mi danno il seguente output: 0 0 0 1 0 2 0 3 0 4 1 1 1 2 1 3 1 4 2 2 2 3 2 4 3 3 3 4 4 4come puoi notare quando il ciclo interno "b" arriva a fine range, a+=1 e "b" ricomincia il ciclo, ma stavolta non da 0 ma da "a". Quello che mi serve è un algoritmo come questo ma che mi consenta di variare a piacimento il numero di cicli interni usando una variabile. Inoltre vorrei poter variare a piacimento anche i valori dei singoli range. itertools.product permette di generare cicli multipli innestati uno nell'altro ma per quanto ne abbia capito sono sempre predeterminati al momento della scrittura del codice. invece a me serve un algoritmo che, in base ai calcoli eseguiti in altre parti del programma, impieghi N cicli innestati con range interni variabili anch'essi in base a certi calcoli; "range(x,y)" che si comportino come nell'esempio. |
|
Scritto da Claudio_F |
2016-06-19 18:41:39 - Re: uso avanzato della funzione itertools.product
|
Magia dei generatori
#---------------------------------------------------------- def makeseq(limits, start=0): for n in range(start, limits[ 0 ]+1): if len(limits) == 1: yield [ n ] else: for subseq in makeseq(limits[1:], n): yield [ n ] + subseq #---------------------------------------------------------- limits = 2, 2, 3, 4 for seq in makeseq(limits): print(seq) --- Ultima modifica di Claudio_F in data 2016-06-19 18:47:36 --- *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione *** |
|
Scritto da ValerioP |
2016-06-19 19:07:27 - Re: uso avanzato della funzione itertools.product
|
Fantastico Claudio_F !! era proprio quello che cercavo ! GRAZIE !
|
Pagina: 1
Esegui il login per scrivere una risposta.