我有一个列表列表,例如:[[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上例中的元素
我不确定如何在不分解列表结构列表并使用 itertools.combinations 和一些 bool 检查来确保我的情况下完成 1 到 n 列表的所有组合m 不组合来自同一个列表的元素。
请您参考如下方法:
之前的帖子提供了涉及嵌套理解的简明解决方案,但缺少可能的子列表集的几个产品,如 ('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')]
