Python 如何在列表的笛卡尔乘积中迭代

Python 如何在列表的笛卡尔乘积中迭代,python,list,for-loop,loops,Python,List,For Loop,Loops,我想在for循环中使用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

我想在for循环中使用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
您要使用以下列表的列表:

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


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

仅为了记录,另一个解决方案是嵌套的
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
函数的作用要清楚得多。使用它的唯一好理由是,如果你处于一个更抽象的环境中;e、 g.您需要向函数传递一个迭代器,而不是立即对其进行迭代,或者如果您有一个列表的任意列表,您希望获取其笛卡尔积(在这种情况下,您可以使用
product(*list)
)。

如果您需要在不同循环级别进行额外处理,此解决方案更有意义。然而,OP只想迭代三元组,使用这种方法必须手动构造三元组。嵌套
for
循环是指它们添加的缩进与列表一样多,这对可读性来说是一个真正的问题。如果在编译时不知道嵌套循环的数量(或者你想在python中称之为编译时),这也不好@financeguycontcode我在回答中已经明确提到,我说过“如果你有一个任意的列表,你想用笛卡尔乘积”
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 ...