учитывая элементы списка и исключений, можно ли игнорировать вычисления комбинаций, содержащих эти элементы?
Пример 1
Учитывая l = [1, 2, 3, 4, 5]
, я хочу рассчитать все комбинации size 4
и исключить комбинации, которые содержат (1, 3)
до того, как они будут вычислены.
Результаты:
All results: Wanted results:
[1, 2, 3, 4] [1, 2, 4, 5]
[1, 2, 3, 5] [2, 3, 4, 5]
[1, 2, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
Все комбинации, содержащие 1 и 3, были удалены.
Пример 2.
предложенный @Eric Duminil
результат для l = [1, 2, 3, 4, 5, 6]
, size 4
и
- исключая
(1, 2, 3)
во второй колонке -
исключая
(1, 2)
в третьей колонкеAll results: Wanted results 1 Wanted results 2 (Excluding [1, 2, 3]): (Excluding [1, 2]) [1, 2, 3, 4] [1, 2, 4, 5] [1, 3, 4, 5] [1, 2, 3, 5] [1, 2, 4, 6] [1, 3, 4, 6] [1, 2, 3, 6] [1, 2, 5, 6] [1, 3, 5, 6] [1, 2, 4, 5] [1, 3, 4, 5] [1, 4, 5, 6] [1, 2, 4, 6] [1, 3, 4, 6] [2, 3, 4, 5] [1, 2, 5, 6] [1, 3, 5, 6] [2, 3, 4, 6] [1, 3, 4, 5] [1, 4, 5, 6] [2, 3, 5, 6] [1, 3, 4, 6] [2, 3, 4, 5] [2, 4, 5, 6] [1, 3, 5, 6] [2, 3, 4, 6] [3, 4, 5, 6] [1, 4, 5, 6] [2, 3, 5, 6] [2, 3, 4, 5] [2, 4, 5, 6] [2, 3, 4, 6] [3, 4, 5, 6] [2, 3, 5, 6] [2, 4, 5, 6] [3, 4, 5, 6]
Все комбинации, содержащие 1 и 2 и 3, были удалены из желаемых результатов 1
Все комбинации, содержащие 1 и 2, были удалены из желаемых результатов 2
У меня гораздо больше комбинаций для вычисления, но для этого требуется много времени, и я хочу уменьшить это время, используя эти исключения.
Пробные решения
С помощью метода 1 комбинации все еще вычисляются
С помощью метода 2 я попытался изменить функцию комбинаций, но я не смог найти правильный способ игнорировать список исключений перед вычислением.
Method 1 | Method 2
|
def main(): | def combinations(iterable, r):
l = list(range(1, 6)) | pool = tuple(iterable)
comb = combinations(l, 4) | n = len(pool)
| if r > n:
for i in comb: | return
if set([1, 3]).issubset(i): | indices = list(range(r))
continue | yield tuple(pool[i] for i in indices)
else | while True:
process() | for i in reversed(range(r)):
| if indices[i] != i + n - r:
| break
| else:
| return
| indices[i] += 1
| for j in range(i+1, r):
| indices[j] = indices[j-1] + 1
| yield tuple(pool[i] for i in indices)
РЕДАКТИРОВАТЬ:
Прежде всего, спасибо вам за вашу помощь, я забыл дать более подробную информацию о ограничениях.
-
Порядок выводов не имеет значения, например, если результат
[1, 2, 4, 5] [2, 3, 4, 5]
или[2, 3, 4, 5] [1, 2, 4, 5]
, это не важно. -
Элементы комбинаций должны быть (если возможно) отсортированы,
[1, 2, 4, 5] [2, 3, 4, 5]
а не[2, 1, 5, 4] [3, 2, 4, 5]
но это не важно, поскольку комбинации можно сортировать после. -
Список исключений - это список всех элементов, которые не должны отображаться в комбинациях вместе. Например, если мой список исключений
(1, 2, 3)
, все комбинации, содержащие 1 и 2 и 3, не должны вычисляться. Однако допускаются комбинации с 1 и 2, а не 3. В этом случае, если я исключаю комбинации, содержащие(1, 2)
и(1, 2, 3)
это совершенно бесполезно, поскольку все комбинации, которые будут фильтроваться(1, 2, 3)
, уже фильтруются(1, 2)
-
Множественные списки исключений должны быть возможны, потому что я использую несколько ограничений для своих комбинаций.
Проверенные ответы
@tobias_k Это решение рассматривает список исключений (1, 2, 3)
поскольку значение исключения (1, 2), (2, 3) and (1, 3)
исключается, если я хорошо понял, это полезно в случае но не в моей текущей проблеме, я изменил вопрос, чтобы дать более подробную информацию, извините за путаницу. В вашем ответе я не могу использовать только списки (1, 2)
и (1, 3)
качестве исключения, как вы указали. Однако большое преимущество этого решения состоит в том, чтобы разрешить множественные исключения.
@Kasramvd и @mikuszefski Ваше решение действительно близко к тому, что я хочу, если оно включает несколько списков исключений, это будет ответ.
Спасибо