Задать вопрос
@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)
  • Вопрос задан
  • 194 просмотра
Подписаться 1 Простой 7 комментариев
Решения вопроса 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)


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

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽