Найти - Пользователи
Полная версия: Помогите решить задачу: Отсортировать текст не использую строковіе функции!
Начало » Центр помощи » Помогите решить задачу: Отсортировать текст не использую строковіе функции!
1
AlexBudyansk
Дан текст (список символов), содержащий в себе буквы, цифры, другие символы. Преобразовать текст, отсортировав каждую группу подряд идущих букв по алфавиту, каждую группу подряд идущих цифр в порядке убывания. Например: «cba1076 /’abfc3785,’’3946f» - «abc7610 /’abcf8753,’’9643f» . Не использовать строковые функции
Nata
а re можно использовать?
>>> import re
>>> def my_sort(group):
...         if re.match("\d+", group):
...                 return "".join(sorted(group, reverse=True))
...         elif re.match("\w+", group):
...                 return "".join(sorted(group))
...         else:
...                 return group
... 
>>>
>>> s="cba1076 /’abfc3785,’’3946f"
>>> groups=re.split(r'(\d+|\W+)',s)
>>> print "".join(map(my_sort, groups))
abc7610 /abcf8753,’’9643f
>>> 
py.user.next
#!/usr/bin/env python3
 
import string
 
def f(s):
    out = ''
    letters = set(string.ascii_letters)
    digits = set(string.digits)
    t = 0
    word = ''
    it = iter(s)
    while True:
        c = next(it, None)
        if t == 0:
            if c in letters:
                word += c
                t = 1
            elif c in digits:
                word += c
                t = 2
            else:
                if c:
                    out += c
        elif t == 1:
            if c in letters:
                word += c
            else:
                out += ''.join(sorted(word))
                word = ''
                if c in digits:
                    word += c
                    t = 2
                else:
                    if c:
                        out += c
                    t = 0
        else:
            if c in digits:
                word += c
            else:
                out += ''.join(sorted(word, reverse=True))
                word = ''
                if c in letters:
                    word += c
                    t = 1
                else:
                    if c:
                        out += c
                    t = 0
        if c is None:
            break
    return out

#!/usr/bin/env python3
 
import string
 
def f(s):
    out = ''
    letters = set(string.ascii_letters)
    digits = set(string.digits)
    t, word = 0, ''
    it = iter(s)
    while True:
        c = next(it, None)
        if c in letters:
            if t == 2:
                out += ''.join(sorted(word, reverse=True))
                word = ''
            word += c
            t = 1
        elif c in digits:
            if t == 1:
                out += ''.join(sorted(word))
                word = ''
            word += c
            t = 2
        else:
            if t == 1:
                out += ''.join(sorted(word))
            elif t == 2:
                out += ''.join(sorted(word, reverse=True))
            if c:
                out += c
            word = ''
            t = 0
        if c is None:
            break
    return out
dimy44
''.join строковой метод
Nata
dimy44
''.join строковой метод
>>> def join(li):
...         s=""
...         for el in li:
...                 s+=el
...         return s
>>>
return join(sorted(group, reverse=True))
>>> print join(map(my_sort, groups))
abc7610 /abcf8753,’’9643f
>>> 
py.user.next
dimy44
''.join строковой метод
Печалька.
>>> out = ''
>>> for i in ['a', 'b', 'c']:
...     out += i
... 
>>> out
'abc'
>>>


Ещё один добавлю:
#!/usr/bin/env python3
 
import re
import string
 
def tr(m):
    s = m.group()
    if set(s) & set(string.digits):
        lst = sorted(s, reverse=True)
    else:
        lst = sorted(s)
    out = ''
    for i in lst:
        out += i
    return out
 
def f(s):
    return re.sub(r'\d+|[a-zA-Z]+', tr, s)
Nata
py.user.next
 if set(s) & set(string.digits):
py.user.next
 return re.sub(r'\d+|[a-zA-Z]+', tr, s)
nice! :D :D
py.user.next
Походу, ему нужен длинный вариант, иначе можно было бы str.join() использовать. Если запрещают, то, скорее всего, хотят алгоритм получить, а алгоритм для подобных задач - конечный автомат.
Isem
s = """cba1076 /’abfc3785,’’3946f"""
for w,d,m in re.findall( '([a-zA-Z]+)|(\d+)|(\W+)', s ):
    print(*( sorted(w)+sorted(d,reverse=True)+[k for k in m]), sep = '', end = '')
abc7610 /abcf8753,’’9643f
>>>


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