在Python中迭代多个列表项的组合

6

我有多个列表,需要对每种可能的列表项组合执行某些操作。在两个列表的情况下,我可以做以下操作:

for a in alist:
  for b in blist:
    # do something with a and b

然而,如果有更多的列表,比如6或7个列表,这种方法似乎不太适用。有没有什么优雅的方法来实现这个迭代?
2个回答

9
你可以使用 itertools.product 来从你的列表中生成所有可能的组合。结果将是一个由 tuple 组成的长列表,其中每个元素都来自你传递列表的顺序。
>>> a = [1,2,3]
>>> b = ['a', 'b', 'c']
>>> c = [4,5,6]
>>> import itertools

>>> list(itertools.product(a,b,c))
[(1, 'a', 4), (1, 'a', 5), (1, 'a', 6), (1, 'b', 4), (1, 'b', 5), (1, 'b', 6), (1, 'c', 4), (1, 'c', 5), (1, 'c', 6),
 (2, 'a', 4), (2, 'a', 5), (2, 'a', 6), (2, 'b', 4), (2, 'b', 5), (2, 'b', 6), (2, 'c', 4), (2, 'c', 5), (2, 'c', 6),
(3, 'a', 4), (3, 'a', 5), (3, 'a', 6), (3, 'b', 4), (3, 'b', 5), (3, 'b', 6), (3, 'c', 4), (3, 'c', 5), (3, 'c', 6)]

例如:
for ai, bi, ci in itertools.product(a,b,c):
    print ai, bi, ci

输出

1 a 4
1 a 5
1 a 6
... etc

1
使用itertools.product(a,b,c)作为for语句的expression_list,而无需先创建新列表。 - wwii

1

如果实际上有6或7个列表,为了可读性,建议使用itertools.product。但对于简单情况,使用list comprehension很简单,并且不需要导入任何模块。例如:

alist = [1, 2, 3]
blist = ['A', 'B', 'C']
clist = ['.', ',', '?']

abc = [(a,b,c) for a in alist for b in blist for c in clist]

for e in abc:
    print("{}{}{} ".format(e[0],e[1],e[2])),

# 1A.  1A,  1A?  1B.  1B,  1B?  1C.  1C,  1C?  2A.  2A,  2A?  2B.  2B,  2B?  2C.  2C,  2C?  3A.  3A,  3A?  3B.  3B,  3B?  3C.  3C,  3C?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接