2012-09-02 6 views
5

me gustaría repetir en un bucle utilizando 3 (o cualquier número de) enumera con cualquier número de elementos, por ejemplo:la forma de repetición en un producto cartesiano de las listas

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 

pero me da :

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

Quiero:

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

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

En realidad quiero esto:

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

Respuesta

12

que desea utilizar el product de las listas:

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"]): 

Demostración:

>>> 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

Gracias, por favor, consulte mi pregunta actualizada de nuevo, – 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 

de salida:

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

Sólo para que conste, otra solución es sólo anidados for bucles:

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 ... 

En mi opinión, esto es mucho más claro que tener que averiguar/recordar lo que hace la función itertools.product. La única buena razón para usar eso es si estás en una situación más abstracta; p.ej. necesita pasar un iterador a una función en lugar de iterar sobre ella de inmediato, o si tiene una lista arbitraria de listas de las que desea tomar el producto cartesiano (en cuyo caso puede usar product(*lists)).

Cuestiones relacionadas