Форум сайта python.su
Собственно, в случайной последовательности четырех типов букв необходимо заменить повторы на их количество в цифрах Например, aaaBbcaaddd => a3b2c1b2c1a2d3
Возможно на этот случай есть подходящий модуль? Например, intertools, counter
Но это кажется можно проделать и без импорта
Например, я пробовал использовать смещения, но это судя по всему не подойдет для решения вопроса
A = list(' ddBBbbaaAAbb') # del A
S = list(' dddBBbbaaAAbb'), list(' ddBBbbaaAAbb') # del S
# буквы (abcd или ABCD) вводятся через input произвольном порядке и регистре, каждый раз, понятно, разные вариации, длина строки тоже варируется
j = 0
i = 0
c = 0
while j < len(A):
n = [S for i in ]
if n == n:
c += int(len(n)/2)
else: c = int(len(n)/2)
print(n, c)
j+=1
#Как минимум хотелось бы понять какой выбрать алгоритм для решения этого вопроса
Офлайн
Писал тут где-то в 2013 году. Алгоритм сжатия RLE.
#!/usr/bin/env python3 # rle packing def func(s): res = '' state = 0 ch = '' n = 0 i = 0 slen = len(s) while i < slen: c = s[i] if state == 0: # first char ch = c n = 1 if i + 1 == slen: res = ch + str(n) state = 1 elif state == 1: # other char if c == ch: # matched n += 1 if i + 1 == slen: res += ch + str(n) else: # didn't match res += ch + str(n) ch = c n = 0 i -= 1 i += 1 return res s = 'aaaarufnnbjff' print(s) print(func(s)) print(func('')) print(func('a')) print(func('aa')) print(func('ab'))
[guest@localhost py]$ ./rle_detaut.py
aaaarufnnbjff
a4r1u1f1n2b1j1f2
a1
a2
a1b1
[guest@localhost py]$
Отредактировано py.user.next (Дек. 6, 2017 01:11:17)
Офлайн
Будем посмотреть.. Спасибо!! Если чесно, просто сломал башку, кажется все просто…..
с другой стороны, если в стандартной или не очень библиотеке для Питона есть подходящий модуль для импорта, все как обычно пишется одной строкой. Например, в SciPython что-то такое могло бы быть.
Офлайн
Идея с readline тоже посещала, но там, как и сказано, с путем к файлу сложности, если прога будет выполнятся на другой машине с неизвестным %PATH и рабочим каталогом
Офлайн
def f(s): it = iter(s) prev = next(it) count = 1 out = '' while True: try: curr = next(it) if prev == curr: count += 1 else: out += prev + str(count) count = 1 prev = curr except StopIteration: out += prev + str(count) break return out
>>> f('ПППриивееит!!!.') 'П3р1и2в1е2и1т1!3.1'
Отредактировано vic57 (Дек. 6, 2017 19:34:00)
Офлайн
vic57def f(s):
>>> f('') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f StopIteration >>>
Офлайн
py.user.nextчто вы вычисляете из пустой строки? флуд какой-то
>>> f('')
Офлайн
vic57Ты просто безграмотный. Пустая строка - это дельта-цепочка.
что вы вычисляете из пустой строки? флуд какой-то
Отредактировано py.user.next (Дек. 9, 2017 03:34:16)
Офлайн
py.user.nextвотри это пионерам. у пустой строки нет итератора, поэтому и исключение
Пустая строка - это дельта-цепочка.
Офлайн
vic57Я тебе ничего не втираю, я книжку читал. При трансляции последовательности ты должен обрабатывать пустую цепочку всегда, если только не оговорено обратное. С чего ты взял, что пустую строку здесь не надо обрабатывать?
вотри это пионерам. у пустой строки нет итератора, поэтому и исключение
vic57Есть.
у пустой строки нет итератора
>>> iter('') <str_iterator object at 0x7fa575528588> >>>
>>> it = iter('') >>> it <str_iterator object at 0x7fa5755285c0> >>> next(it, None) >>>
Отредактировано py.user.next (Дек. 9, 2017 03:57:47)
Офлайн