2012-09-02 13 views
5

的笛卡尔积重复我想在一个迭代使用3环(或任意数量的)与任意数量的元素列表,例如:如何在列表

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 

,但它给了我:

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

我想:

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

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

其实我想这一点:

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

回答

12

你想用列表的product

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

演示:

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

谢谢,请再次看到我上面提到的问题, – alwbtc

4

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

输出:

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

为了记录,另一种解决方案是刚刚嵌套循环for

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

在我看来,这比找到了/还记得itertools.product功能做什么更清晰了很多。使用它的唯一好理由是,如果你处于更抽象的情况下;例如你需要将一个迭代器传递给一个函数,而不是立即迭代它,或者如果你有一个任意列表的列表,你可以使用笛卡尔乘积(在这种情况下,你可以使用product(*lists))。