跨多个列表的所有组合

2024-04-18 02:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个多维列表(列表列表),我想得到子列表项的所有可能组合。你知道吗

例如输入:

my_list = [
    ['a', 'b'], ['1', '2'], ['@', '&']
]

会导致:

result = [
['a'],
['b'],
['1'],
['2'],
['@'],
['&'],
['a', '1'],
['a', '2'],
['a', '@'],
['a', '&']
['b', '1'],
['b', '2'],
['b', '@'],
['b', '&'],
['a', '1', '@'],
['a', '1', '&'],
['a', '2', '@'],
['a', '2', '&'],
...]

我试过用itertools.产品(*列表),但这会导致所有项的组合,而没有较小的组合集。看来itertools.组合, itertools.排列等等,我不太明白我在找什么。你知道吗

有没有快速的方法?你知道吗


Tags: 方法列表产品myresultlistitertools
1条回答
网友
1楼 · 发布于 2024-04-18 02:21:58

在这种情况下,首先迭代所有可能的长度。对于每个长度,您选择列表的所有可能组合,对于每个组合,您使用itertools.product

def weird_product(*data):
    for i in range(1,len(data)+1):
        for subdata in itertools.combinations(data,i):
            for elem in itertools.product(*subdata):
                yield elem

这会产生:

>>> list(weird_product(*data))
[('a',), ('b',), ('1',), ('2',), ('@',), ('&',), ('a', '1'), ('a', '2'), ('b', '1'), ('b', '2'), ('a', '@'), ('a', '&'), ('b', '@'), ('b', '&'), ('1', '@'), ('1', '&'), ('2', '@'), ('2', '&'), ('a', '1', '@'), ('a', '1', '&'), ('a', '2', '@'), ('a', '2', '&'), ('b', '1', '@'), ('b', '1', '&'), ('b', '2', '@'), ('b', '2', '&')]

或更优雅的格式:

>>> list(weird_product(*data))
[('a',),
 ('b',),
 ('1',),
 ('2',),
 ('@',),
 ('&',),
 ('a', '1'),
 ('a', '2'),
 ('b', '1'),
 ('b', '2'),
 ('a', '@'),
 ('a', '&'),
 ('b', '@'),
 ('b', '&'),
 ('1', '@'),
 ('1', '&'),
 ('2', '@'),
 ('2', '&'),
 ('a', '1', '@'),
 ('a', '1', '&'),
 ('a', '2', '@'),
 ('a', '2', '&'),
 ('b', '1', '@'),
 ('b', '1', '&'),
 ('b', '2', '@'),
 ('b', '2', '&')]

相关问题 更多 >