Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 25, 2013 08:11:22

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Задача по Python для начинающих с циклами и списками

ИМХО, вы неправильный путь решения задачи выбрали, вот никто и не спешит вам в этом еще и помогать.

Офлайн

#2 Дек. 25, 2013 10:41:40

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача по Python для начинающих с циклами и списками

dimy44
ИМХО, вы неправильный путь решения задачи выбрали, вот никто и не спешит вам в этом еще и помогать.
Это я уже понял.
не могу понять логику и манипуляции которые происходят к примеру у Вас, поэтому пытался продавить свое, теперь сам вижу когда в дебри забрася что изначально не правильно пошел
def filter_num(num):
    temp, res = [num[0]], []
    for n in num[1:]:
        old = temp[-1]
        if old != n:
            if len(temp) > 1:
                if res and old == '#':
                    res.append(res[-1])
                else:
                    res.append(old)
            temp = [n]
        else:
            temp.append(n)
    if len(temp) > 1:
        res.append(n)
    return ''.join(res)
print(filter_num('32224#6665###9966##555'))

Офлайн

#3 Дек. 25, 2013 13:27:10

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Задача по Python для начинающих с циклами и списками

Я не претендую на лучшее решение, но попробую разъяснить свой код

def filter_num(num):
    '''Список для итоговых символов:'''
    res = [] 
    '''Список-буфер для временного
       хранения дублирующихся символов,
       сразу поместили туда 0-й элемент:'''
    temp = [num[0]]
    '''Начнём перебор с 1-го элемента,
       т.к. 0-й уже в буфере:'''
    for n in num[1:]:
        '''Записываем сразу в переменную значение из буфера,
           т.к. оно понадобится больше одного раза, 
           и нам не придётся каждый раз его 
           извлекать из списка:'''
        old = temp[-1]
        '''Если текущее значение не равно предыдущему (old),
           то значит пора смотреть, что накопилось в буфере:'''
        if old != n:
            '''Если в буфере более одного элемента, то у нас не помеха:'''
            if len(temp) > 1:
                '''Если мы накопили в буфере символы '#', то
                   добавляем в список res последнее значение
                   из этого списка, т.е. дублируем поседнюю 
                   цифру из отфильтрованного на текущий 
                   момент номера. На всякий случай перед этим
                   проверяем, не пуст ли список res 
                   (такое может быть, если на входе из "не помех"
                    самыми первыми были поданы символы '#'):'''
                if res and old == '#':
                    res.append(res[-1])
                '''Если же значение из буфера - цифра, то
                   добавляем его в итоговый список res:'''
                else:
                    res.append(old)
            '''Мы взяли из буфера то что нужно,
               или же там был оди символ (помеха), но теперь 
               мы перезаписываем буфер, помещая туда
               новый текущий символ:'''
            temp = [n]
        '''Если же текущий символ продолжает быть равным old, то добавляем его в буфер temp:'''
        else:
            temp.append(n)
    '''Цикл закончен, но там могут остаться элементы 
       с последних итераций, когда последние равные элементы
       добавлялись в буфер temp, но в res ничего не извлеклось,
       т.к. мы не нарвались на символ, отличный от вышеназванных,
       и условие if old != n: не выполнилось. Проверяем,
       и если это так, добавляем в итоговый
       список этот элемент или, если там #, дублируем
       последний из res:'''
    if len(temp) > 1:
        if n == '#':
            if res:
                res.append(res[-1])
        else:
            res.append(n)
    '''Возвращаем результат, преобразовав содержимое
       списка в строку:'''
    return ''.join(res)
print(filter_num('32224#6665###9966##555'))

Отредактировано dimy44 (Дек. 25, 2013 15:22:53)

Офлайн

#4 Дек. 25, 2013 18:16:24

Mazay_Ka
Зарегистрирован: 2013-04-03
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача по Python для начинающих с циклами и списками

dimy44 спасибо большее так понятнее.

Уважаемый Singularity не могли бы вы еще свою логику расписать если не затруднит, мне будет очень полезно.
Спасибо.

Singularity
Romissвторая попытка
data = raw_input('enter code: ')
def clean(data):
    res = ''
    i = ''
    number = 0
    for char in data:
        if char == i or char == "#":
            number +=1
        else:
            if number >0:
                res += i
            i = char
            number = 0
    return res 
print clean(data)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version