簡體   English   中英

在 Python 中迭代多個列表的項目組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM