Форум сайта python.su
Дан текст (список символов), содержащий в себе буквы, цифры, другие символы. Преобразовать текст, отсортировав каждую группу подряд идущих букв по алфавиту, каждую группу подряд идущих цифр в порядке убывания. Например: «cba1076 /’abfc3785,’’3946f» - «abc7610 /’abcf8753,’’9643f» . Не использовать строковые функции
Офлайн
а 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 >>>
Отредактировано Nata (Окт. 13, 2014 16:35:15)
Офлайн
#!/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
Отредактировано py.user.next (Окт. 14, 2014 06:50:24)
Офлайн
''.join строковой метод
Офлайн
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 >>>
Офлайн
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)
Отредактировано py.user.next (Окт. 14, 2014 09:03:29)
Офлайн
py.user.nextif set(s) & set(string.digits):
py.user.nextnice! :D :Dreturn re.sub(r'\d+|[a-zA-Z]+', tr, s)
Офлайн
Походу, ему нужен длинный вариант, иначе можно было бы str.join() использовать. Если запрещают, то, скорее всего, хотят алгоритм получить, а алгоритм для подобных задач - конечный автомат.
Офлайн
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 >>>
Отредактировано Isem (Окт. 19, 2014 13:08:18)
Офлайн