У меня есть список переменных размера, например
[1, 2, 3, 4]
и я хочу, чтобы всякий раз разбить этот список на два:
([], [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], [])
Я уверен, что это не неизвестная проблема, и, вероятно, есть алгоритм для этого, но я не мог найти его. Кроме того, это не должно использовать какие-либо внешние библиотеки, но работать с простыми языковыми функциями (циклы, условия, методы/функции, переменные и т.д.), Найденные на большинстве языков.
Я написал хакерское решение в Python:
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, [])
Однако он использует функции библиотеки и не очень приятен в целом.