Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2017 00:44:35

Labradorka
Зарегистрирован: 2017-12-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

кодирование текста

Собственно, в случайной последовательности четырех типов букв необходимо заменить повторы на их количество в цифрах Например, 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
#Как минимум хотелось бы понять какой выбрать алгоритм для решения этого вопроса

Офлайн

#2 Дек. 6, 2017 01:10:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодирование текста

Писал тут где-то в 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)

Офлайн

#3 Дек. 6, 2017 16:27:57

Labradorka
Зарегистрирован: 2017-12-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

кодирование текста

Будем посмотреть.. Спасибо!! Если чесно, просто сломал башку, кажется все просто…..

с другой стороны, если в стандартной или не очень библиотеке для Питона есть подходящий модуль для импорта, все как обычно пишется одной строкой. Например, в SciPython что-то такое могло бы быть.

Офлайн

#4 Дек. 6, 2017 16:31:49

Labradorka
Зарегистрирован: 2017-12-06
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

кодирование текста

Идея с readline тоже посещала, но там, как и сказано, с путем к файлу сложности, если прога будет выполнятся на другой машине с неизвестным %PATH и рабочим каталогом

Офлайн

#5 Дек. 6, 2017 19:28:58

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

кодирование текста

 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'
с регистром сам разберешься - upper/lower

Отредактировано vic57 (Дек. 6, 2017 19:34:00)

Офлайн

#6 Дек. 7, 2017 04:05:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодирование текста

vic57
 def f(s):
  
>>> f('')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in f
StopIteration
>>>
Да и цикл через исключение замедляет программу в целом. Исключения медленные.



Офлайн

#7 Дек. 9, 2017 03:12:55

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

кодирование текста

py.user.next
>>> f('')
что вы вычисляете из пустой строки? флуд какой-то

Офлайн

#8 Дек. 9, 2017 03:31:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодирование текста

vic57
что вы вычисляете из пустой строки? флуд какой-то
Ты просто безграмотный. Пустая строка - это дельта-цепочка.



Отредактировано py.user.next (Дек. 9, 2017 03:34:16)

Офлайн

#9 Дек. 9, 2017 03:44:08

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

кодирование текста

py.user.next
Пустая строка - это дельта-цепочка.
вотри это пионерам. у пустой строки нет итератора, поэтому и исключение

Офлайн

#10 Дек. 9, 2017 03:54:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

кодирование текста

vic57
вотри это пионерам. у пустой строки нет итератора, поэтому и исключение
Я тебе ничего не втираю, я книжку читал. При трансляции последовательности ты должен обрабатывать пустую цепочку всегда, если только не оговорено обратное. С чего ты взял, что пустую строку здесь не надо обрабатывать?

И я вижу, что ты пытался, но ты не знаешь ещё и питон достаточно хорошо.

vic57
у пустой строки нет итератора
Есть.
  
>>> iter('')
<str_iterator object at 0x7fa575528588>
>>>

На тебе секрет
  
>>> it = iter('')
>>> it
<str_iterator object at 0x7fa5755285c0>
>>> next(it, None)
>>>

Ещё ты не только используешь исключения там, где надо без них обходиться, так ты ещё перехватываешь исключение StopIteration, которое вообще считается служебным. То есть перехват этого исключения - признак сам знаешь чего.



Отредактировано py.user.next (Дек. 9, 2017 03:57:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version