簡體   English   中英

如何在Python中獲得1到n個列表列表的所有組合

[英]How to get all combinations of 1 to n lists of lists in Python

我有一個列表列表,例如: [[a,b,c],[1,2,3],[x,y]]

我想產生[a],[b],...,[a,1],[a,2],...,[a,1,x],[a,1,y]

查看解決方案,我已經看到itertools.combinations如何產生單個列表的所有組合, itertools.product如何產生最高級別的組合,即上面的示例中的3個元素

我不確定如何遍歷1到n個列表的所有組合,而不分解列表結構的列表,並使用itertools.combinations進行一些布爾檢查以確保不合並同一列表中的元素。

我認為這是您要尋找的:

>>> import itertools
>>> x = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y']] # your list of lists
>>> [tup for sublist in [itertools.product(*x[:n+1]) for n in range(len(x))] 
         for tup in sublist]
[('a',), ('b',), ('c',), 
 ('a', 1), ('a', 2), ('a', 3), 
 ('b', 1), ('b', 2), ('b', 3), 
 ('c', 1), ('c', 2), ('c', 3), 
 ('a', 1, 'x'), ('a', 1, 'y'), ('a', 2, 'x'), ('a', 2, 'y'), ('a', 3, 'x'), ('a', 3, 'y'), 
 ('b', 1, 'x'), ('b', 1, 'y'), ('b', 2, 'x'), ('b', 2, 'y'), ('b', 3, 'x'), ('b', 3, 'y'), 
 ('c', 1, 'x'), ('c', 1, 'y'), ('c', 2, 'x'), ('c', 2, 'y'), ('c', 3, 'x'), ('c', 3, 'y')]

您只需要將itertools.product放在列表列表的所有前綴上(即x[:1]x[:2] ,...)。 外部列表推導僅用於展平內部列表推導生成的列表列表。

先前的帖子提供了涉及嵌套理解的簡潔解決方案,但是缺少可能的子列表集(例如('a', 'x')幾種產品。 我將嘗試以更具可讀性的方式將其分解:

lst = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y']]
result = []  # collect your products

# n sublists: iterate over all 'sub_lengthes'
for length in xrange(1, len(lst)+1):
    # iterate over all possible combinations of sublists
    for c in itertools.combinations(lst, length):
        # iterate over all products for each combination
        for res in itertools.product(*c):
            result.append(res)

print(result)

>>> result
# 3 + 3 + 2 = 8 singletons 
[('a',), ('b',), ('c',), (1,), (2,), (3,), ('x',), ('y',), 
# 3*3 + 3*2 + 3*2 = 21 pairs
('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3), 
('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y'), ('c', 'x'), ('c', 'y'),
(1, 'x'), (1, 'y'), (2, 'x'), (2, 'y'), (3, 'x'), (3, 'y'), 
# 3*3*2 = 18 triplets
('a', 1, 'x'), ('a', 1, 'y'), ('a', 2, 'x'), ('a', 2, 'y'), ('a', 3, 'x'), ('a', 3, 'y'), ('b', 1, 'x'), ('b', 1, 'y'), ('b', 2, 'x'), ('b', 2, 'y'), ('b', 3, 'x'), ('b', 3, 'y'), ('c', 1, 'x'), ('c', 1, 'y'), ('c', 2, 'x'), ('c', 2, 'y'), ('c', 3, 'x'), ('c', 3, 'y')]

您可以在列表推導中使用itertools.combinationsitertools.product()來計算所有單,對和三元組的乘積:

>>> from itertools import product
>>> lst = [['a','b','c'],[1,2,3],['x','y']]
>>> [[list(product(*t)) for t in combinations(lst,i)] for i in range(1,len(lst)+1)]
[[[('a',), ('b',), ('c',)], [(1,), (2,), (3,)], [('x',), ('y',)]], 
 [[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)], [('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y'), ('c', 'x'), ('c', 'y')], [(1, 'x'), (1, 'y'), (2, 'x'), (2, 'y'), (3, 'x'), (3, 'y')]],
[[('a', 1, 'x'), ('a', 1, 'y'), ('a', 2, 'x'), ('a', 2, 'y'), ('a', 3, 'x'), ('a', 3, 'y'), ('b', 1, 'x'), ('b', 1, 'y'), ('b', 2, 'x'), ('b', 2, 'y'), ('b', 3, 'x'), ('b', 3, 'y'), ('c', 1, 'x'), ('c', 1, 'y'), ('c', 2, 'x'), ('c', 2, 'y'), ('c', 3, 'x'), ('c', 3, 'y')]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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