Найти - Пользователи
Полная версия: Задача по Python для начинающих с циклами и списками
Начало » Python для новичков » Задача по Python для начинающих с циклами и списками
1 2
Mazay_Ka
Условие:
(Повышенная сложность) Написать программу декодирования телефонного номера для АОН.
По запросу АОНа АТС посылает телефонный номер, используя следующие правила:
— Если цифра повторяется менее 2 раз, то это помеха и она должна быть отброшена
— Каждая значащая цифра повторяется минимум 2 раза
— Если в номере идут несколько цифр подряд, то для обозначения «такая же цифра как предыдущая» используется идущий 2 или более подряд раз знак #

Например, входящая строка 4434###552222311333661 соответствует номеру 4452136
Кстати, регулярные выражения использовать в этих заданиях — нельзя

вот собственно что я наваял прошу не судить строго,
пишет Value error tel.remove(n) n not in list range
был на хабре вопрос его закрыли уже нельзя спросить , не дает покоя уже 3 день , в питоне опыта не много,
Спасибо.
aon = raw_input('enter code: ')
tel =[]
range1 = len(aon)
range1 = range1-1
n=0
for int in aon:
    if n < range1:
        n=n+1
        if aon[n-1] == aon[n]:
            tel.append(aon[n-1])
        elif aon[n]== '#':
            #aon[n-1] = aon[n-1]+'#'
            tel.append(aon[n-1])
            tel.append(aon[n])
range2 = len(tel)
range2 = range2-1
print tel
n=0
for int2 in tel:
    if n<range2:
        n=n+1
        if tel[n-1]==tel[n] and tel[n+1]!='#':
            tel.remove(n)
        elif tel[n]!='#':
            tel.remove(n)
print tel            
Master_Sergius
Удаляешь из списка в то время, когда по нему лазаешь.

Вот, мой вариант:

import sys
 
def get_number(string):
    number = ''
    for index in range(len(string)-1):
        if ((string[index] == string[index + 1] and string[index] != '#') or
           (string[index + 1] == '#' and string[index] != '#')):
            current_number = string[index]
            same = True
        else:
            if same:
                number += current_number
                same = False
    return number
 
if __name__ == '__main__':
    string = sys.argv[1]
    number = get_number(string)
    print number

python tel.py 4434###552222311333661
4452136
Singularity
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 >=2:
                res += i
            i = char
    return res 
print clean(data)
Singularity
Master_Sergius
я твое решение и решение ТС даже розпарсить не могу

Хочу увидеть пример решения данной задачи в функциональом стиле
Master_Sergius
Ну да, более красиво получилось. Ничего, опыта поднаберу и всё будет пучком. Главное, что хоть задачи решаются. Кстати, как там моё ТЗ? Не пробовал? Но об этом уже в личку можно.
Romiss
Singularity
Извените за критику, но Ваш код работает неполноценно, результат работы вашего кода соответствует: 4523136, а должен - 4452136.
Сижу думаю, как решить вопрос…
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)
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'))
Mazay_Ka
Спасибо, большое, просто задачка была в теме строки пытался обойтись циклами и списками, тоесть более простым вариантом, а тут много более сложных и интерсных вариантов, до этого с функций еще не разбирал спасибо буду учить.
Mazay_Ka
Такой вопрос вообщем пошел всетаки я своим путем получилось в итоге два списка
tel=[]  # тут отсеились все которые безпары сиволов или без # такого вида к примеру в 22223#
te_l=[] # а тут те что нужно удалить из верхнего чтоб получить чистый к примеру 222#

как эти списки сравнить и в одном удались те елементы которые есть во втором

если что вот код всего этого дела
aon = raw_input('enter code: ')
tel =[]
tel_l =[]
range1 = len(aon)
range1 = range1-1
n=0
for int in aon:
    if n < range1:
        n=n+1
        if aon[n-1] == aon[n]:
            tel.append(aon[n-1])
        elif aon[n]== '#':
            #aon[n-1] = aon[n-1]+'#'
            tel.append(aon[n-1])
            tel.append(aon[n])
range2 = len(tel)
range2 = range2-1
print tel
n=0
for int2 in tel:
    if n<range2:
        n=n+1
        if tel[n-1]==tel[n] and tel[n+1]!='#':
            tel_l.append(tel[n])
        elif tel[n]=='#':
            tel_l.append(tel[n])
print tel_l            
print tel 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB