Какие всевозможные варианты комбинаций можно получить?

  • 6 августа 2023 г. 7:17
Ответы на вопрос 6
В зависимости от того, сколько элементов содержит каждый из вариантов комбинаций, всевозможные варианты комбинаций могут быть получены следующими способами:

1) Для двух элементов: АВ, ВА

2) Для трех элементов: АВС, АСВ, ВАС, ВСА, САВ, СВА

3) Для четырех элементов: АВСД, АВДС, АСВД, АСДВ, АДСВ, АДВС, ВАСД, ВАДС, ВСАД, ВСДА, ВДСА, ВДАС, САВД, САДВ, СВАД, СВДА, СДАВ, СДВА, ДАСВ, ДАВС, ДСАВ, ДСВА, ДВАС, ДВСА.

4) Для пяти элементов: АВСДЕ, АВДСЕ, АВДЕС, АСВДЕ, АСДВЕ, АСДЕВ, АДСВЕ, АДСЕВ, АДЕСВ, АДЕВС, ВАСДЕ, ВАДСЕ, ВАДЕС, ВСАДЕ, ВСДАЕ, ВСДЕА, ВДСАЕ, ВДСЕА, ВДЕСА, ВДЕАС, САВДЕ, САДВЕ, САДЕВ, СВАДЕ, СВДАЕ, СВДЕА, СДАВЕ, СДАЕВ, СДЕАВ, СДЕВА, ДАСВЕ, ДАСЕВ, ДАЕСВ, ДАЕВС, ДСАВЕ, ДСЕАВ, ДСЕВА, ДВАСЕ, ДВЕСА, ДЕСАВ, ДЕВСА.
itertools.combinations. Pass the range of indices of your string to it. You will get a list of combinations where you can replace indices with Z and Y. Here's a rough code sketch. I'm not a Python expert, so there might be a more concise implementation. Especially the ugly hack of converting the string to a list because strings in Python are immutable.

import itertools

def GenerateAll(source, rep):
  for comb in itertools.combinations(range(len(source)), len(rep)):
    s = list(source)
    for (i, j) in enumerate(comb):
      s[j] = rep[i];
    yield "".join(s)

print(list(GenerateAll("abcd", "XY")))
# ['XYcd', 'XbYd', 'XbcY', 'aXYd', 'aXcY', 'abXY']


The simplest way to understand this is through nested loops. The outer loop iterates over the indices and replaces one character at a time with Z. The inner loop iterates over the remaining indices and replaces them with either Z or Y.


STRING
FOR i FROM 1 TO LENGTH(STRING)
  REPLACE(STRING, i, 'Z') STRING
FOR i FROM 1 TO LENGTH(STRING)-1
  REPLACE(STRING, i, 'Z')
    FOR j FROM i+1 TO LENGTH(STRING)
        REPLACE(STRING, j, 'Y')
itertools.combinations. Вы можете использовать функцию itertools.combinations, которая принимает диапазон индексов вашей строки в качестве аргумента. Затем вы получите список комбинаций, где каждая комбинация представляет замену символов на заданные позиции Z или Y. Ниже приведен скетч кода. Обратите внимание, что я преобразую строку в список (list), потому что строки в Python неизменяемы (immutable). 

import itertools

def GenerateAll(source, rep):
  for comb in itertools.combinations(range(len(source)), len(rep)):
    s = list(source)
    for (i, j) in enumerate(comb):
      s[j] = rep[i];
    yield "".join(s)
    
print(list(GenerateAll("abcd", "XY")))
# ['XYcd', 'XbYd', 'XbcY', 'aXYd', 'aXcY', 'abXY']


Используйте itertools.combinations для создания всех необходимых комбинаций замен символов в строке. Для этого передайте функции диапазон индексов строки. В результате вы получите список комбинаций, где каждая комбинация представляет собой строку с замененными символами на заданные позиции Z или Y. Приведен набросок кода, где строка "abcd" заменяется на "XYcd", "XbYd", "XbcY", "aXYd", "aXcY" и "abXY".
Похожие вопросы