Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2013 22:12:56

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

подскажите пожалуйста как лаконичнее решить задачу:
есть строка с неопределённым колличеством слов:

line = "aaa bbb ccc ddd sss qqq eee"
надо каждый третий пробел заменить на “\n”
что бы получилось так:
"aaa bbb ccc\nddd sss qqq\neee"
c мудулем re ещё не знаком, а надо ли он здесь?
у самого получилось как то вот так:
NumberSpaces = 3
counterSpaces = 0
outline = ""
line = "aaa bbb ccc ddd sss qqq eee"
for symbol in line:
    if symbol == " ":
        counterSpaces += 1
        if counterSpaces == NumberSpaces:
            outline = "".join((outline, "\n"))
            counterSpaces = 0
        else:
           outline = "".join((outline, symbol))
    else:
        outline = "".join((outline, symbol))
print outline

Отредактировано vrabey (Ноя. 2, 2013 22:25:42)

Офлайн

#2 Ноя. 2, 2013 22:54:38

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

vrabey
надо каждый третий пробел заменить на “\n”
''.join([ ''.join([word, '\n']) if enum % 3 == 0 else ''.join([word, ' ']) for enum, word in enumerate(s.split(), 1)])[:-1]

''.join(map(lambda x: x[1]+'\n' if x[0]%3==0 else x[1]+' ', enumerate(s.split(), 1)))[:-1]



Отредактировано Budulianin (Ноя. 3, 2013 01:50:14)

Офлайн

#3 Ноя. 2, 2013 23:50:58

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

import textwrap
line = "aaa bbb ccc ddd sss qqq eee"
indexes = [index for index, value in enumerate(line, 1) if value.isspace() and not index % 3]
newline = textwrap.fill(line, indexes[0])
print(repr(newline))
#Ответ:
'aaa bbb ccc\nddd sss qqq\neee'

Офлайн

#4 Ноя. 3, 2013 00:15:42

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

smoke853
С таким же успехом, ты мог сделать просто

line = "aaa bbb ccc ddd sss qqq eee"
newline = textwrap.fill(line, 12)

textwrap.fill(string, n) вставляет символ конца строки, через каждые n символов



Отредактировано Budulianin (Ноя. 3, 2013 00:16:02)

Офлайн

#5 Ноя. 3, 2013 00:32:36

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

Budulianin, это то понятно, что можно в уме подсчитать что 3 пробел будет 12-м индексом. А а если строка будет вида: 'aaaa bbbb cccc dddd ssss qqqq eeee' тогда 3 пробел будет уже не 12-м индексом, а 15-м, и когда строки разные каждый раз в уме считать какой же индекс у 3 пробела? Вот я так подумал и сделал список индексов.

Офлайн

#6 Ноя. 3, 2013 00:39:33

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

smoke853

Вообще-то я имел в виду, что такой вариант работает только со строками, в которых слова одинаковой длины. Хоть одно слово будет другой длины - не будет работать

Да и перебирать весь список, чтобы потом воспользоваться, только 1 элементом это печаль. Тогда уж просто str.find(' ')



Отредактировано Budulianin (Ноя. 3, 2013 01:35:03)

Офлайн

#7 Ноя. 3, 2013 01:08:15

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

Budulianin
Хоть одно слово будет другой длины - не будет работать
Кстати да, не проверил с словами разной длины подправил.
import textwrap
line = "a bbb cccc dd ssss q eee rr u gggg"
indexes = [index for index, value in enumerate(line) if value.isspace()]
newline = textwrap.fill(line, indexes[2])
print(repr(newline))
#Ответ:
'a bbb cccc\ndd ssss q\neee rr u\ngggg'

Отредактировано smoke853 (Ноя. 3, 2013 01:09:48)

Офлайн

#8 Ноя. 3, 2013 01:31:22

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

smoke853
Ничего не изменилось. Ты вычисляешь положение пробелов, а потом проставляешь конец строки через каждые n символов



Отредактировано Budulianin (Ноя. 3, 2013 01:32:39)

Офлайн

#9 Ноя. 3, 2013 02:17:45

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

Budulianin
Ничего не изменилось.
Эх жаль, думал красиво написать именно с помощью textwrap но не тут то было. Видимо тут textwrap не подойдет: если допустим вместо
indexes[2]
использовать
indexes[3]
то он вроде как разбивает по каждому 4-му пробелу, а вот
indexes[1]
уже не правильно разбивает по каждому 2-му пробелу. Т.е. такая схема как
indexes[n]
, где n - каждый n-й пробел, не работает.
P.S. Но все же спасибо, что указали на ошибки.

Отредактировано smoke853 (Ноя. 3, 2013 02:19:02)

Офлайн

#10 Ноя. 3, 2013 02:37:42

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

как правильно отформатировать строку

smoke853
P.S. Но все же спасибо, что указали на ошибки.

Ну тогда укажу ещё на одну Windows 7 Ultimate sp1 x64



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version