#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
ЕСЛИ ВАМ НУЖНЫ КАКИЕ-ЛИБО РАЗЪЯСНЕНИЯ ПО ИСПОЛЬЗУЕМОЙ ФУНКЦИИ, ПОЖАЛУЙСТА, НЕ СТЕСНЯЙТЕСЬ ОСТАВЛЯТЬ КОММЕНТАРИИ