Diese Antwort ist nicht so sauber wie die Verwendung von itertools, aber die Ideen könnten nützlich sein.
In Anlehnung an die Konstruktion von zip() aquí könnten wir Folgendes tun.
>>> a = iter([[1,2,3],[4,5,6],[7,8,9,10]])
>>> sentinel = object()
>>> result = [[]]
>>> while True:
>>> l = next(a,sentinel)
>>> if l == sentinel:
>>> break
>>> result = [ r + [digit] for r in result for digit in l]
>>> print(result)
[[1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 4, 10], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 5, 10], [1, 6, 7], [1, 6, 8], [1, 6, 9], [1, 6, 10], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 4, 10], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 5, 10], [2, 6, 7], [2, 6, 8], [2, 6, 9], [2, 6, 10], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 4, 10], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 5, 10], [3, 6, 7], [3, 6, 8], [3, 6, 9], [3, 6, 10]]
Wir verwenden a
als Iterator, um sukzessive das nächste Element zu erhalten, ohne von vornherein wissen zu müssen, wie viele es gibt. Die next
Der Befehl gibt Folgendes aus sentinel
(bei dem es sich um ein Objekt handelt, das ausschließlich für diesen Vergleich erstellt wurde, siehe aquí für einige Erklärungen), wenn wir keine Listen mehr in a
, wodurch die if
Anweisung auslösen, damit wir aus der Schleife ausbrechen.