Как заставить программу печатать определенные буквы в этом конкретном формате, который я ей даю?

#python #python-3.x #run-length-encoding

#питон #python-3.x #кодирование длины выполнения

Вопрос:

поэтому мне нужно закодировать программу, которая , например ,при вводе 3[a]2[b] печатает « aaabb » или при 3[ab]2[c] вводе печатает « abababcc «(в основном печатает это количество этой буквы в заданном порядке). я попытался использовать цикл for для повторения первого заданного ввода,а затем обнаружить в нем буквы » [ » , чтобы он знал, что нужно повторно печатать, но я не знаю, как я могу заставить его также понять, где заканчивается эта строка, и именно здесь я мог бы ее получить, что, вероятно, не слишком полезно:

 string=input() string=string[::-1] bulundu=6 for i in string:  if i!="]":  if i!="[":  lst.append(i)  if i=="[":  break  

Комментарии:

1. Вам разрешено использовать регулярные выражения? for cnt, letters in re.findall(r"(d )[([^]] )]", "3[ab]2[c]"): print(letters * int(cnt), end='') ??

2. Есть '5[23]' ли что-то, что вам нужно уметь делать? Есть '22[a]' ли что-то, что вам нужно уметь делать?

Ответ №1:

Подход, который я выбрал, состоит в том, чтобы убрать скобки, разделить элементы на список, затем пройти по списку, и если элемент представляет собой число, добавьте столько повторений следующего элемента в результат для вывода:

 import re  data = "3[a]2[b]" # Remove brackets and convert to a list data = re.sub(r'[[]]', ' ', data).split()  result = [] for i, item in enumerate(data):  # If item is a number, print that many of the next item  if item.isdigit():  result.append(data[i 1] * int(item))  print(''.join(result)) # aaabb  

Ответ №2:

Другой подход, вдохновленный использованием Суббу re.findall . Этот подход находит все «пары» цифр и букв, используя группы совпадений, а затем умножает их для получения требуемого текста:

 import re  data = "3[a]2[b]"  matches = re.findall('(d )[([a-zA-Z] )]',data) # [(3, 'a'), (2, 'b')] for x in matches:  print(x[1] * int(x[0]), end='')  #aaabb  

Ответ №3:

Длинная и документированная версия, не использующая регулярных выражений, но простая обработка строк и списков:

  • сначала разделите входные данные на части, которые представляют собой цифры и тексты
  • затем снова их рекомбинируйте
  • Я решил документировать со встроенными комментариями

Это можно было бы сделать так:

 # testcases are tuples of input and correct result testcases = [ ("3[a]2[b]","aaabb"),   ("3[ab]2[c]","abababcc"),   ("5[12]6[c]","1212121212cccccc"),   ("22[a]","a"*22)]  # now we use our algo for all those testcases for inp,res in testcases:   split_inp = [] # list that takes the splitted values of the input  num = 0 # accumulator variable for more-then-1-digit numbers  in_text = False # bool that tells us if we are currently collecting letters   # go over all letters : O(n)  for c in inp:   # when a [ is reached our num is complete and we need to store it  # we collect all further letters until next ] in a list that we  # add at the end of your split_inp  if c == "[":  split_inp.append(num) # add the completed number   num = 0 # and reset it to 0  in_text = True # now in text  split_inp.append([]) # add a list to collect letters   # done collecting letters   elif c == "]":  in_text = False # no longer collecting, convert letters  split_inp[-1] = ''.join(split_inp[-1]) # to text    # between [ and ] ... simply add letter to list at end  elif in_text:  split_inp[-1].append(c) # add letter   # currently collecting numbers  else:  num *= 10 # increase current number by factor 10  num  = int(c) # add newest number    print(repr(inp), split_inp, sep="n") # debugging output for parsing part   # now we need to build the string from our parsed data  amount = 0  result = [] # intermediate list to join ['aaa','bb']   # iterate the list, if int remember it, it text, build composite  for part in split_inp:  if isinstance(part, int):  amount = part  else:  result.append(part*amount)   # join the parts   result = ''.join(result)    # check if all worked out  if result == res:  print("CORRECT: ", result   "n")  else:  print (f"INCORRECT: should be '{res}' but is '{result}'n")    

Результат:

 '3[a]2[b]' [3, 'a', 2, 'b'] CORRECT: aaabb  '3[ab]2[c]' [3, 'ab', 2, 'c'] CORRECT: abababcc  '5[12]6[c]' [5, '12', 6, 'c'] CORRECT: 1212121212cccccc  '22[a]' [22, 'a'] CORRECT: aaaaaaaaaaaaaaaaaaaaaa  

Это также будет касаться случаев, когда некоторые другие решения не будут работать. '5[12]'

Ответ №4:

Вы можете зафиксировать как количество повторений n , так и шаблон для повторения v за один раз, используя описанное pattern . Это по существу соответствует любой последовательности знаков, которая является первой группы нужно захватить, причина, почему d между кронштейнами (..) — затем [следуют все, — это ничего уже вторая картина из интереса, значит между ведра (...) — который затем последовало ]. findall найдете всех этих матчах в переданной строке, то первый матч — номер будет приведен к int и используется как множитель для строки-шаблона. Затем список int(n) * v присоединяется к пустому пространству. Искаженные шаблоны могут создавать исключения или ничего не возвращать.

Во всяком случае, в коде:

 import re  pattern = re.compile("(d )[(.*?)]")  def func(x): return "".join([v*int(n) for n,v in pattern.findall(x)])  print(func("3[a]2[b]")) print(func("3[ab]2[c]"))  

выход

 aaabb abababcc  

следовать за

Другое решение, которое достигает того же результата, без использования регулярного выражения (хорошо, совсем не хорошо, я понимаю…):

 def func(s): return "".join([int(x[0])*x[1] for x in map(lambda x:x.split("["), s.split("]")) if len(x) == 2])  

Ответ №5:

Я не намного больше, чем новичок, и, глядя на другие ответы, я подумал, что понимание регулярных выражений может быть проблемой для нового участника, такого как вы, так как я сам на самом деле не занимался регулярными выражениями.

Удобный для начинающих способ сделать это может состоять в том, чтобы выполнить цикл по входной строке и использовать строковые функции isnumeric() , такие как isalpha()

 data = "3[a]2[b]" chars = [] nums = [] substrings = []  for i, char in enumerate(data):  if char.isnumeric():  nums.append(char)  if char.isalpha():  chars.append(char)  for i, char in enumerate(chars):  substrings.append(char * int(nums[i])) string = "".join(substrings) print(string)  

выход:

 aaabb  

И на пробу различных значений для данных:

 data = "0[a]2[b]3[p]" OUTPUT bbppp   data = "1[a]1[a]2[a]" OUTPUT aaaa  

ПРИМЕЧАНИЕ: В случае, если вы не знакомы с вышеуказанными функциями, это строковые функции, которые достаточно понятны. Они используются как lt;your_string_heregt;.isalpha (), который возвращает значение true тогда и только тогда, когда строка является алфавитом (пробелы, цифры и символы возвращают значение false И, аналогично, для isnumeric()

Например,

  • «]».isnumeric() и «]».isalpha() возвращают False
  • «a».isalpha() возвращает значение True

ЕСЛИ ВАМ НУЖНЫ КАКИЕ-ЛИБО РАЗЪЯСНЕНИЯ ПО ИСПОЛЬЗУЕМОЙ ФУНКЦИИ, ПОЖАЛУЙСТА, НЕ СТЕСНЯЙТЕСЬ ОСТАВЛЯТЬ КОММЕНТАРИИ