[英]Iterate over combinations of items of multiple lists in Python
我有幾個列表,我需要對這些列表項的每個可能組合做一些事情。 在兩個列表的情況下,我可以這樣做:
for a in alist:
for b in blist:
# do something with a and b
但是,如果有更多的列表,比如 6 或 7 個列表,這種方法似乎不太情願。 有沒有辦法優雅地實現這個迭代?
您可以使用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
如果實際上有 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?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.