跨多个列表的所有组合
问题描述:
给定一个多维列表(列表的列表)我想获得所有可能的子列表项的组合。跨多个列表的所有组合
。例如输入:
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(*名单),但结果中的所有项目的不小组合组合。似乎itertools.combinations,itertools.permutations等不完全给我所寻找的。
有没有一种快速的方法来做到这一点?
答
在这种情况下,你首先迭代所有可能的长度。对于每一个长度为你挑选列出的所有可能的组合,并为每一个组合使用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','@']'出现在输出中? – chepner
什么不清楚?我试图获得多个列表的所有项目的组合。我没有故意不清楚。如果你帮忙解释你不明白的事情,我会努力做出更明确的表达。 – Ripster
“多个列表的所有项目的组合”仍然非常模糊。你有一些关于如何绘制物品的心理模型,以及哪些应该或不应该被视为有效的组合,这对你来说似乎很明显,但并不明显。你需要明确地说出来。 – user2357112