2012-09-02 18 views
5

Vorrei iterare in un ciclo for con 3 (o un qualsiasi numero di) elenca con qualsiasi numero di elementi, ad esempio:Come iterare in un prodotto cartesiano di liste

from itertools import izip 
for x in izip(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 
    print x 

ma mi dà :

('AAA', 'M', '00:00') 
('BBB', 'Q', '01:00') 
('CCC', 'S', '02:00') 

voglio:

('AAA', 'M', '00:00') 
('AAA', 'M', '01:00') 
('AAA', 'M', '02:00') 
. 
. 

('CCC', 'B', '03:00') 

In realtà io voglio questo:

for word, letter, hours in [cartesian product of 3 lists above] 
    if myfunction(word,letter,hours): 
     var_word_letter_hours += 1 

risposta

12

si desidera utilizzare il product delle liste:

from itertools import product 

for word, letter, hours in product(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 

Demo:

>>> from itertools import product 
>>> for word, letter, hours in product(["AAA", "BBB", "CCC"], ["M", "Q", "S", "K", "B"], ["00:00", "01:00", "02:00", "03:00"]): 
...  print word, letter, hours 
... 
AAA M 00:00 
AAA M 01:00 
AAA M 02:00 
AAA M 03:00 
... 
CCC B 00:00 
CCC B 01:00 
CCC B 02:00 
CCC B 03:00 
+0

Grazie, si prega di vedere la mia domanda aggiornata sopra di nuovo, – alwbtc

4

Uso itertools.product:

import itertools 

for x in itertools.product(["AAA", "BBB", "CCC"], 
          ["M", "Q", "S", "K", "B"], 
          ["00:00", "01:00", "02:00", "03:00"]): 
    print x 

uscita:

('AAA', 'M', '00:00') 
('AAA', 'M', '01:00') 
... 
('CCC', 'B', '02:00') 
('CCC', 'B', '03:00') 
0

Solo per la cronaca, un'altra soluzione è solo annidata for loop:

for a in ["AAA", "BBB", "CCC"]: 
    for b in ["M", "Q", "S", "K", "B"]: 
     for c in ["00:00", "01:00", "02:00", "03:00"]: 
      x = (a, b, c) 
      # Use x ... 

A mio parere, questo è molto più chiaro di dover scoprire/ricordare ciò che la funzione itertools.product fa. L'unica buona ragione per usarlo è se ti trovi in ​​una situazione più astratta; per esempio. è necessario passare un iteratore a una funzione piuttosto che iterarlo immediatamente o se si dispone di un elenco arbitrario di elenchi di cui si desidera utilizzare il prodotto cartesiano (nel qual caso è possibile utilizzare product(*lists)).

Problemi correlati