Я пишу исследовательский скрипт на Python, и у меня есть список из 9 элементов:

a = [1,2,3,4,5,6,7,8,9]

Я хотел бы найти все комбинации подмножеств, содержащих 3 элемента (а НЕ сами 3 элемента), например:

a_new = [ [ [1,2,3],[4,5,6],[7,8,9] ] ],
          [ [2,3,4],[5,6,7],[8,9,1] ],          
          [ [3,4,6],[1,2,8],[5,7,9] ], etc.... ]


            
  • элементы не повторяются в подмножествах
  • множества [3,2,1] и [1,2,3] являются одним и тем же множеством и не уникальны

Возможно, вы сталкивались с таким случаем, или какая-нибудь библиотека Python справится с этим?

Приветствия

0
zxhouse 11 Окт 2021 в 22:13

2 ответа

Лучший ответ

Используйте itertools.combinations следующим образом:

from itertools import combinations

a = {1, 2, 3, 4, 5, 6, 7, 8, 9}

# pick 3
for c_out in combinations(a, r=3):
    s_out = set(c_out)
    # pick the next 3 from the those elements that are not already picked (i.e not in s_out)
    for c_in in combinations(a - s_out, r=3):
        # there only 3 elements left so only one way to pick
        rest = tuple(a - (s_out | set(c_in)))
        print(c_out, c_in, rest)

Выходные данные (частично)

(1, 2, 3) (4, 5, 6) (8, 9, 7)
(1, 2, 3) (4, 5, 7) (8, 9, 6)
(1, 2, 3) (4, 5, 8) (9, 6, 7)
(1, 2, 3) (4, 5, 9) (8, 6, 7)
(1, 2, 3) (4, 6, 7) (8, 9, 5)
(1, 2, 3) (4, 6, 8) (9, 5, 7)
(1, 2, 3) (4, 6, 9) (8, 5, 7)
(1, 2, 3) (4, 7, 8) (9, 5, 6)
(1, 2, 3) (4, 7, 9) (8, 5, 6)
(1, 2, 3) (4, 8, 9) (5, 6, 7)
(1, 2, 3) (5, 6, 7) (8, 9, 4)
(1, 2, 3) (5, 6, 8) (9, 4, 7)
(1, 2, 3) (5, 6, 9) (8, 4, 7)
(1, 2, 3) (5, 7, 8) (9, 4, 6)

Вы можете узнать больше об операциях над множествами (объединение, различие) в документации .

3
Dani Mesejo 11 Окт 2021 в 19:42

Вы можете использовать встроенный модуль itertools

from itertools import combinations

a = [1,2,3,4,5,6,7,8,9]

combination = list(combinations(a, 3))

Этот вывод в кортеже, и вы можете легко преобразовать его в список.

2
Omid 11 Окт 2021 в 19:24