Es scheint, wie Sie sich für eine Kombination aus combinations
und product
suchen: Verwenden Sie combinations
die möglichen Kombinationen ohne Ersatz für die wiederholten Listen zu bekommen, dann product
verwenden all diese Kombinationen zu kombinieren. Sie können die Listen und Zählungen in zwei Listen, zip
diese Listen, setzen und einen Generatorausdruck verwenden, um alle Kombinationen zu erhalten.
from itertools import product, combinations, chain
lists = [a,b,c,d,e]
counts = [1,2,2,1,1]
combs = product(*(combinations(l, c) for l, c in zip(lists, counts)))
In diesem Beispiel hat der combs
Generator 48 Elemente, unter anderem:
[(([2, 3],), ([5, 6], [7, 8]), ([11, 12], [13, 14]), ([15, 16],), ([12, 16],)),
...
(([2, 3],), ([5, 6], [7, 8]), ([11, 12], [13, 14]), ([17, 18],), ([15, 19],)),
(([2, 3],), ([5, 6], [9, 10]),([11, 12], [13, 14]), ([15, 16],), ([12, 16],)),
...
(([3, 4],), ([5, 6], [7, 8]), ([11, 12], [13, 14]), ([15, 16],), ([12, 16],)),
...
(([3, 4],), ([5, 6], [7, 8]), ([11, 12], [13, 14]), ([17, 18],), ([15, 19],)),
...
(([3, 4],), ([7, 8], [9, 10]),([11, 12], [13, 14]), ([17, 18],), ([15, 19],))]
Wenn Sie flattened lists wollen, nur chain
sie:
>>> combs = (list(chain(*p)) for p in product(*(combinations(l, c) for l, c in zip(lists, counts))))
>>> list(combs)
[[[2, 3], [5, 6], [7, 8], [11, 12], [13, 14], [15, 16], [12, 16]],
...
[[3, 4], [7, 8], [9, 10], [11, 12], [13, 14], [17, 18], [15, 19]]]
Sind die zwei Unentschieden aus ' b' mit oder ohne Ersatz? –
Ich bin mir nicht sicher, ob ich verstehe, was Sie hier wollen (können Sie die ersten Beispielausgaben oder etwas geben, um sicher zu sein?), Aber wenn Sie "itertools.combinations" in 'list' für eine anständige Anzahl von Eingaben wickeln ist fast garantiert, um Ihre Erinnerung zu blasen.Die Anzahl der Ausgaben wächst um ungefähr "O (n!)" (Faktorielles Wachstum); Normalerweise wird von Ihnen erwartet, dass Sie die Kombinationen nacheinander durchlaufen und nicht alle auf einmal speichern. – ShadowRanger
Ohne Ersatz, –