Все возможные комбинации из списка без повторения позиции участника - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть список чисел, и мне нужны все комбинации, чтобы ни один участник не повторил свою позицию в списке.

Пример: если у меня есть {1, 2, 3}, то {3, 2, 1} недопустимо, потому что «2» находится в той же позиции.Единственными хорошими результатами являются {3, 1, 2} и {2, 3, 1}.Мне нужно это в большем масштабе, пока у меня есть это:

import itertools
x = [1, 2, 3, 4, 5, 6, 7]
y = 5
comb = []
comb.extend(itertools.combinations(x,y))
print(comb)

Это дает мне все комбинации, но мне нужно исключить те, которые имеют один и тот же член в той же позиции, желательно нетолько при печати, но в списке гребней.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Не уверен, понял ли я ... но, может быть, это то, что вы хотите ...

from collections import deque
from itertools import islice

def function(x, y):
    Q = deque(x)
    states = set()
    for _ in range(len(x)):
        states.add(tuple(islice(Q, 0, y)))
        Q.appendleft(Q.pop())
    return states

x = [1, 2, 3, 4, 5, 6, 7]
y = 5
resp = function(x, y)
print(resp)
>>> {(5, 6, 7, 1, 2), (1, 2, 3, 4, 5), (7, 1, 2, 3, 4), (2, 3, 4, 5, 6), (4, 5, 6, 7, 1), (6, 7, 1, 2, 3), (3, 4, 5, 6, 7)}
0 голосов
/ 20 ноября 2018

Из ожидаемого результата, который вы написали, кажется, что вы ищете перестановки, а не комбинации

import itertools
import numpy as np
x = [1, 2, 3]
y = 3

no_repeat_permutations = []
for candidate_perm in itertools.permutations(x,y):
    for p in map(np.array, no_repeat_permutations):
        if any(np.array(candidate_perm) == p):
            break
    else:
        no_repeat_permutations.append(candidate_perm)

print(no_repeat_permutations)

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

Я использую numpy для поэлементного сравнения, если какое-либо поэлементное сравнение в прошлых результатах равно True, мы пропускаем эту перестановку. В случае, если мы не находим такого сравнения, мы вводим оператор else и сохраняем перестановку.

Для дальнейшего объяснения о for-else см. этот вопрос SO

...