Forum >> Principianti >> uso avanzato della funzione itertools.product

Pagina: 1

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 ! ;)
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

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 4
come 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.
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 ***
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 ---
Fantastico Claudio_F !! era proprio quello che cercavo ! :) GRAZIE ! :ok:


Pagina: 1



Esegui il login per scrivere una risposta.