Форум сайта python.su
подскажите пожалуйста как лаконичнее решить задачу:
есть строка с неопределённым колличеством слов:
line = "aaa bbb ccc ddd sss qqq eee"
"aaa bbb ccc\nddd sss qqq\neee"
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)
Офлайн
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)
Офлайн
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'
Офлайн
smoke853
С таким же успехом, ты мог сделать просто
line = "aaa bbb ccc ddd sss qqq eee" newline = textwrap.fill(line, 12)
Отредактировано Budulianin (Ноя. 3, 2013 00:16:02)
Офлайн
Budulianin, это то понятно, что можно в уме подсчитать что 3 пробел будет 12-м индексом. А а если строка будет вида: 'aaaa bbbb cccc dddd ssss qqqq eeee' тогда 3 пробел будет уже не 12-м индексом, а 15-м, и когда строки разные каждый раз в уме считать какой же индекс у 3 пробела? Вот я так подумал и сделал список индексов.
Офлайн
smoke853
Вообще-то я имел в виду, что такой вариант работает только со строками, в которых слова одинаковой длины. Хоть одно слово будет другой длины - не будет работать
Да и перебирать весь список, чтобы потом воспользоваться, только 1 элементом это печаль. Тогда уж просто str.find(' ')
Отредактировано Budulianin (Ноя. 3, 2013 01:35:03)
Офлайн
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)
Офлайн
smoke853Ничего не изменилось. Ты вычисляешь положение пробелов, а потом проставляешь конец строки через каждые n символов
Отредактировано Budulianin (Ноя. 3, 2013 01:32:39)
Офлайн
BudulianinЭх жаль, думал красиво написать именно с помощью textwrap но не тут то было. Видимо тут textwrap не подойдет: если допустим вместо
Ничего не изменилось.
indexes[2]
indexes[3]
indexes[1]
indexes[n]
Отредактировано smoke853 (Ноя. 3, 2013 02:19:02)
Офлайн
smoke853
P.S. Но все же спасибо, что указали на ошибки.
Офлайн