Форум сайта python.su
Добрый день.
Самостоятельно по чуть-чуть изучаю питон. Не могу разобраться в одной задаче.
Задание: Кодирование осуществляется следующим образом:
s = ‘aaaabbсaa’ преобразуется в ‘a4b2с1a2’, то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки.
Написал следующий код:
text = list(input()) total = 0 while len(text) > 0: for i in text: for j in range(len(text)): if i == text[j]: total += 1 else: break print(i, total, sep='', end='') for _ in range(total): text.remove(i) total = 0
Офлайн
text = 'aaaabbсaa' accamulate = [] chunk = [] for i in text: if i in chunk: chunk.append(i) else: accamulate.append(chunk) chunk = [] chunk.append(i) else: accamulate.append(chunk) outlet = [] for i in accamulate[1:]: outlet.append(i[0]) outlet.append(str(len(i))) print("".join(outlet))
Отредактировано AD0DE412 (Дек. 20, 2022 22:10:58)
Офлайн
text = 'aaaabbсaa' out = [] for n, i in enumerate(text): if n == 0: out.append([i, 1]) else: if i == out[-1][0]: out[-1][1] += 1 else: out.append([i, 1]) print(out) res = ''.join(str(i) for pair in out for i in pair) print(res)
[['a', 4], ['b', 2], ['с', 1], ['a', 2]]
a4b2с1a2
Офлайн
xam1816
у вас 4 (плюс еще enumerate) цикла у меня 3
хорошо бы что то придумать как это уменьшить хотя бы до 2
Офлайн
indiwiduumНе используй .remove() для списка, который перебираешь через for.
не могу понять откуда a4b2a0c1a2
>>> lst = ['a1', 'b2', 'a3', 'c4', 'a5', 'd6', 'e7'] >>> >>> for i in lst: ... if i[0] == 'a': ... print(i) ... lst.remove(i) ... else: ... print(i) ... a1 a3 a5 e7 >>>
Отредактировано py.user.next (Дек. 20, 2022 23:20:08)
Офлайн
py.user.next
Офлайн
text = 'aaaabbсaa' accamulate = 1 chunk = '' outlet = '' # this is like this code ... but ... ''' for i in text: if i == chunk: chunk = i accamulate += 1 else: outlet += chunk outlet += str(accamulate) chunk = i accamulate = 1 else: outlet += chunk outlet += str(accamulate) ''' # this uses side effects and global variables (it is no good # but code can be much more faster ... probably) # though code in the first example # uses global variables and this is ... unimportant ... def to_try(var): global accamulate, chunk, outlet chunk = var accamulate += 1 def to_false(var): global accamulate, chunk, outlet outlet += chunk outlet += str(accamulate) chunk = var accamulate = 1 [to_try(i) if i == chunk else to_false(i) for i in text] to_false(text[-1]) print(outlet[1:]) # 'a4b2c1a2' # and i still think that it is better to use OOP here ... class Enc: def __init__(self, var=''): '''it accepts only str without digits''' if sum(list([i.isdigit() for i in var])): raise ValueError(f'this str ({var}) is incorrect '\ f'accepts only str without digital numbers') else: self.var = var self._accamulate = 1 self._chunk = '' self._outlet = '' [self._to_try(i) if i == self._chunk else self._to_false(i)\ for i in self.var] self._to_false(self.var[-1]) self.enc = self._outlet[1:] def _to_try(self, var): self._chunk = var self._accamulate += 1 def _to_false(self, var): self._outlet += self._chunk self._outlet += str(self._accamulate) self._chunk = var self._accamulate = 1 def set(self, var): '''reinitiated all variables of the exemplar and returns encrypted str''' self.__init__(var) return self.enc def __str__(self): '''return encrypted str to print, initiates your variable etc''' return self.enc # because it is the coolest ... lets test it print(Enc(text).enc) # 'a4b2c1a2' test = Enc(text) print(test) # 'a4b2c1a2' print(test.enc) # 'a4b2c1a2' test.set('qqwweeevvvvvvr') print(test.var, test.enc) # 'qqwweeevvvvvvr q2w2e3v6r1' # test for error asdsf = Enc('dfgdfg') # ValueError: # 'this str (dfgdf1g) is incorrect accepts only str without digital numbers' try: asdsf.set('dfgdf1g') except ValueError as e: print(e) finally: print(help(test))
Отредактировано AD0DE412 (Дек. 21, 2022 15:34:16)
Офлайн
indiwiduumесть не пользоваться такими конструкциями тк это постояный источник ошибок
Есть какой-то лайфхак это обойти?
Офлайн
text = list(input('>')) out = '' count = 0 while text: if not out: out += text.pop(0) count += 1 else: current_ch = text.pop(0) if out[-1] == current_ch: count += 1 else: out += str(count) out += current_ch count = 1 out += str(count) print(out)
Офлайн
ну … норм
надо подумать о варианте с сортировкой ну или подобном
Отредактировано AD0DE412 (Дек. 21, 2022 17:32:26)
Офлайн