Найти все способы, чтобы решить список в три - PullRequest
1 голос
/ 06 ноября 2019

Как видно из названия, как мне найти все способы, которыми список можно разделить на три списка? Например, 1,2,3 вернуло бы

[1, 2, 3]
[1] [2] [3]
[1, 2] [3] [ ]
[1] [2, 3] [ ]
[1, 3] [2] [ ]

Я пробовал кучу вещей, но просто не могу их получить. Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

вы можете использовать combinations из библиотеки itertools

import itertools

my_list = [1, 2, 3]

for i in range(len(my_list)):
    print(list(itertools.combinations(my_list, i + 1)))

, которая выводит

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

, теперь вы можете добавить длину каждого списка и добавить отсутствующие пустые списки(чтобы закончить иметь 3 списка) и вуаля - у вас есть результат

0 голосов
/ 06 ноября 2019

Вот возможное решение:

import itertools

# your input data list
a = [1, 2, 3]

# util function to convert list of tuples to list of list
f = lambda x: [list(i) if isinstance(i, tuple) else i for i in x]

# list1 is all combinations of sublists having length = 1,2,..length_of_a from input list `a` and empty list [] 
list1 = []
for i in range(1, len(a)+1):
    list1.extend(itertools.combinations(a, i))
list1.extend([()]*(len(a)-1))

# list2 is all combinations of sublists having length = length_of_a from the list1
list2 = list(set(itertools.combinations(list1, len(a))))

#  filtering out and converting list of tuples for the final results
results = [f(i) for i in list2 if sum(itertools.chain(*i)) == sum(a) and set(itertools.chain(*i)) == set(a)]
results.append(a)

# print out the results
for r in results:
    print(r)

Выходы:

[[1, 2, 3], [], []]

[[3], [1, 2], []]

[[1], [2], [3]]

[[2], [1, 3], []]

[[1], [2, 3], []]

[1, 2, 3]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...