Найти - Пользователи
Полная версия: как правильно отформатировать строку
Начало » Центр помощи » как правильно отформатировать строку
1 2 3 4 5 6
vrabey
подскажите пожалуйста как лаконичнее решить задачу:
есть строка с неопределённым колличеством слов:
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
Budulianin
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]
smoke853
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'
Budulianin
smoke853
С таким же успехом, ты мог сделать просто
line = "aaa bbb ccc ddd sss qqq eee"
newline = textwrap.fill(line, 12)

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

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

Да и перебирать весь список, чтобы потом воспользоваться, только 1 элементом это печаль. Тогда уж просто str.find(' ')
smoke853
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'
Budulianin
smoke853
Ничего не изменилось. Ты вычисляешь положение пробелов, а потом проставляешь конец строки через каждые n символов
smoke853
Budulianin
Ничего не изменилось.
Эх жаль, думал красиво написать именно с помощью textwrap но не тут то было. Видимо тут textwrap не подойдет: если допустим вместо
indexes[2]
использовать
indexes[3]
то он вроде как разбивает по каждому 4-му пробелу, а вот
indexes[1]
уже не правильно разбивает по каждому 2-му пробелу. Т.е. такая схема как
indexes[n]
, где n - каждый n-й пробел, не работает.
P.S. Но все же спасибо, что указали на ошибки.
Budulianin
smoke853
P.S. Но все же спасибо, что указали на ошибки.

Ну тогда укажу ещё на одну Windows 7 Ultimate sp1 x64
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