Определение ассортимента списков, элементы которых составляют точные элементы в большом списке - PullRequest
0 голосов
/ 30 мая 2018

Python 3.

Преамбула

Итак, у меня есть список элементов, которые можно упорядочить так (или любым другим способом):

List = [c, d, a, c, b] 

Позволяет упростить задачу:

List = [a, b, c, c, d]

Таким образом, список может иметь дубликаты и иметь длину от 1 до 10.

Пользователь выберет номер диапазона, например:

r = 3

Номер диапазона является частью логики, которая создает число списков, которое содержит все возможные комбинации подпоследовательностей «Список» для длин от 1 до r.Каждая комбинация может быть переставлена ​​любым способом.Учитывая 'List' и 'r' в этом примере, пользователь получит следующий выбор списков:

%Lists of length 1.  
ListSelection1 = [[a], [b], [c], [c], [d]]

%Lists of length 2.
ListSelection2 = [[a, b], [a, c], [a, c], [a, d], [b, c], [b, c], [b, d], [c, c], [c, d], [c, d]]

%Lists of length 3.
ListSelection3 = [[a, b, c], [a, b, c], [a, b, d], [a, c, c], [a, c, d], [a, c, d], [b, c, c], [b, c, d], [b, c, d], [c, c, d]]

Эти списки будут расположены в другом списке, например:

ListSelections = [ListSelection1, ListSelection2, ListSelection3]

Проблема

Как определить все возможные комбинации (под) списков в «ListSelections», которые вместе содержат такой же набор элементов, что и «List»?Порядок элементов не имеет значения.Что касается приведенного выше примера, допустимыми комбинациями списков будут [b, c] и [a, c, d] или [b] + [c] + [d] + [a, c].Вы получаете смысл.

Мне нужно определить все правильные комбинации списков и позиции этих списков в «ListSelections».

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я думаю, что вы хотите найти набор разделов мультисета .Для этого вы можете использовать sympy следующим образом:

from sympy.utilities.iterables import multiset_partitions
res=[p for p in multiset_partitions(["a","b","c","c","d"])]

Вывод:

[[['a', 'b', 'c', 'c', 'd']],
 [['a', 'b', 'c', 'c'], ['d']],
 [['a', 'b', 'c', 'd'], ['c']],
 [['a', 'b', 'c'], ['c', 'd']],
 [['a', 'b', 'c'], ['c'], ['d']],
 [['a', 'b', 'd'], ['c', 'c']],
 [['a', 'b', 'd'], ['c'], ['c']],
 [['a', 'b'], ['c', 'c', 'd']],
 [['a', 'b'], ['c', 'c'], ['d']],
 [['a', 'b'], ['c', 'd'], ['c']],
 [['a', 'b'], ['c'], ['c'], ['d']],
 [['a', 'c', 'c', 'd'], ['b']],
 [['a', 'c', 'c'], ['b', 'd']],
 [['a', 'c', 'c'], ['b'], ['d']],
 [['a', 'c', 'd'], ['b', 'c']],
 [['a', 'c', 'd'], ['b'], ['c']],
 [['a', 'c'], ['b', 'c', 'd']],
 [['a', 'c'], ['b', 'c'], ['d']],
 [['a', 'c'], ['b', 'd'], ['c']],
 [['a', 'c'], ['b'], ['c', 'd']],
 [['a', 'c'], ['b'], ['c'], ['d']],
 [['a', 'd'], ['b', 'c', 'c']],
 [['a', 'd'], ['b', 'c'], ['c']],
 [['a', 'd'], ['b'], ['c', 'c']],
 [['a', 'd'], ['b'], ['c'], ['c']],
 [['a'], ['b', 'c', 'c', 'd']],
 [['a'], ['b', 'c', 'c'], ['d']],
 [['a'], ['b', 'c', 'd'], ['c']],
 [['a'], ['b', 'c'], ['c', 'd']],
 [['a'], ['b', 'c'], ['c'], ['d']],
 [['a'], ['b', 'd'], ['c', 'c']],
 [['a'], ['b', 'd'], ['c'], ['c']],
 [['a'], ['b'], ['c', 'c', 'd']],
 [['a'], ['b'], ['c', 'c'], ['d']],
 [['a'], ['b'], ['c', 'd'], ['c']],
 [['a'], ['b'], ['c'], ['c'], ['d']]]
0 голосов
/ 30 мая 2018

Ваша спецификация немного запутана, но я подозреваю, что вам нужны либо "перестановки", либо "комбинации":

https://docs.python.org/2/library/itertools.html

В Python есть библиотека, которая сделает это за вас.

output = [itertools.permutations(input, r_) for r_ in range(r)]

...