Python 跨多个列表的所有组合
给定一个多维列表(列表列表),我希望得到子列表项的所有可能组合 例如,输入:Python 跨多个列表的所有组合,python,Python,给定一个多维列表(列表列表),我希望得到子列表项的所有可能组合 例如,输入: my_list = [ ['a', 'b'], ['1', '2'], ['@', '&'] ] 将导致: result = [ ['a'], ['b'], ['1'], ['2'], ['@'], ['&'], ['a', '1'], ['a', '2'], ['a', '@'], ['a', '&'] ['b', '1'], ['b', '2'], ['b', '@'], ['b'
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.product(*list),但结果是所有项目的组合都没有更小的组合集。似乎itertools.compositions、itertools.permutation等并没有给出我想要的东西
有没有一种快速的方法可以做到这一点?在这种情况下,您首先迭代所有可能的长度。对于每个长度,您可以选择列表的所有可能组合,对于这些组合,您可以使用
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', '&')]
例如,
['1','@']
应该出现在输出中吗?什么是不清楚的?我试图得到多个列表中所有项目的组合。我不是故意不清楚。如果你能帮我解释一下你不明白的地方,我会尽量说得更清楚。“多个列表中所有项目的组合”仍然非常模糊。你有一些关于如何绘制项目以及什么应该或不应该算作有效组合的心智模型,这对你来说似乎很明显,但并不明显。你需要明确地说出来。我想要所有可能的组合,不包括相同列表中的项目组合。例如,itertools.combinations('ABCD',2)-->AB-AC-AD-BC-BD-CD是一个问题,因为它正在组合同一列表中的项。我认为,通过查看预期的输出,可以清楚地了解这一点,这就是我提供它的原因。我正在寻找的功能,但在多个列表和所有长度之间。