@Canp

Удалить из ряда элементы ,как?

Подскажите, не могу понять что я не так делаю.

Я хочу сгенерировать все косбинации путем удаления из ряда:

"123456012345601234560123456012345601234560123456012345601234560" длинной 64,

48 элементов(тут я заменяю удаления на х):
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

т.е. получить в результаие все варианты рядов длинной 22 элемента ,т.е. 22 цифры,

а получактся у меня их только соединить.

тут в примере, я использую x за место удаления(я еше не нашел как отпрааить сделать что бы удаляло,поэтрму за место ascii символа удалить, я мчпользую x ) и получаю на выходе:

xxxxxxxxxxxxxxxxxxxxxxxxxx601234x6012345601234560xx3x56012345601




т.е. получается что все x добавлябтся к началу и потом по одному х ,(перебором от 1 до 48 ), заменняют в ряде 123456012345601234560123456012345601234560123456012345601234560


и получается на выходе:
xxxxxxxxxxxxxxxxxxxxxxxxxx601234x6012345601234560xx3x56012345601

а как сделать что бы сразу все удаления(или Х как в данном конкретном случае) добавило и потом все улаления расставляло, что бы длина на выходе ВсегдА была 22 знака, и без перебора всех вподряд комбинаций а именно удалением из существубщего ряда что бы получить все возможнве варинты рядов, длинной, равной , - начальный ряд минус количество удалений в нем.

?

подскажите please.

Большое спасибо.


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)
    



for x  in (GenerateAll("1234560123456012345601234560123456012345601234560123456012345601", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")):print(x)
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Например, вот так:
def GenerateAll(source, rep):
  for comb in itertools.combinations(range(len(source)), len(source)-len(rep)):
    s = list()
    prev = 0
    for (i, j) in enumerate(comb):
      s.append(source[j]);
    yield "".join(s)


Обратите внимание, перебираем не сочетания из удаляемых позиций, а из 22 оставляемых (кстати, у вас числа не бьются, 48+22 = 60 != 64). Тут порядок в ответе будет обратный (первая строка будет "xxxxxx...xxxx12..." а не "12..xxx..xx". Если нужен тот же порядок, то будет чуть сложнее:
def GenerateAll(source, rep):
  for comb in itertools.combinations(range(len(source)), len(rep)):
    s = list()
    prev = 0
    last = 0
    for (i, j) in enumerate(comb):
      while (last < j):
          s.append(source[last]);
          last += 1
      last += 1
    while (last < len(source)):
          s.append(source[last]);
          last += 1
    yield "".join(s)


Это не самое питонистое решение, возможно в какой-то библиотеке уже есть готовая функция, которая вырезает из строки символы по индексам.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы