Aufteilen einer Liste in zwei Unterlisten auf alle möglichen Arten

Ich habe eine Liste mit variabler Größe, zum Beispiel

[1, 2, 3, 4]

und ich möchte alle Möglichkeiten nutzen, um diese Liste in zwei Teile aufzuteilen:

([], [1, 2, 3, 4])
([1], [2, 3, 4])
([2], [1, 3, 4])
([3], [1, 2, 4])
([4], [1, 2, 3])
([1, 2], [3, 4])
([1, 3], [2, 4])
([1, 4], [2, 3])
([2, 3], [1, 4])
([2, 4], [1, 3])
([3, 4], [1, 2])
([1, 2, 3], [4])
([1, 2, 4], [3])
([1, 3, 4], [2])
([2, 3, 4], [1])
([1, 2, 3, 4], [])

Ich bin mir ziemlich sicher, dass dies kein unbekanntes Problem ist und es wahrscheinlich einen Algorithmus dafür gibt, aber ich konnte keinen finden. Dies sollte auch keine externen Bibliotheken verwenden, sondern mit einfachen Sprachmerkmalen (Schleifen, Bedingungen, Methoden / Funktionen, Variablen, ...) funktionieren, die in den meisten Sprachen zu finden sind.

Ich habe eine Hackish-Lösung in Python geschrieben:

def get_all(objects):
    for i in range(1, len(objects)):
        for a in combinations(objects, i):
            for b in combinations([obj for obj in objects if obj not in up], len(objects) - i):
                yield State(up, down)
    if objects:
        yield State([], objects)
        yield State(objects, [])

s verwendet jedoch Bibliotheksfunktionen und sieht im Allgemeinen nicht besonders gut au

Antworten auf die Frage(8)

Ihre Antwort auf die Frage