Я не знаю, если какой-либо модуль делает это ..., но я вынужден сказать, что Проблема здесь в основном What is the most "pythonic" way to iterate over a list in chunks?, за исключением того, что у вас есть строки вместо списков. Но, пожалуй, самый питонический путь здесь должен быть самым питоническим, и это хорошо, если вы можете избежать re
. Так вот решение (не уверен, что вы хотите, если строка не может быть равномерно разделена на количество частей, если вы просто выбросить «остаток»):
# python 3 version
def foo(string, n):
part_len = -(-len(string) // n) # same as math.ceil(len(string)/n)
return [''.join(x) for x in zip(*[iter_str] * part_len)]
Таким образом:
>>> s = "Hello, my name is foo"
>>> foo(s, 7)
['Hel', 'lo,', ' my', ' na', 'me ', 'is ', 'foo']
>>> foo(s, 6)
['Hell', 'o, m', 'y na', 'me i', 's fo']
Теперь, по общему признанию, foo(s, 6)
возвращает список длины 5, что несколько удивительно. Возможно, вы хотите вместо этого создать исключение. Если вы хотите сохранить остаток, затем использовать zip_longest
from itertools import zip_longest
def foo2(string, n, pad=''):
part_len = -(-len(string) // n)
return [''.join(x) for x in zip_longest(*[iter(string)] * part_len, fillvalue=pad)]
>>> foo2(s, 6)
['Hell', 'o, m', 'y na', 'me i', 's fo', 'o']
>>> foo2(s, 6, pad='?')
['Hell', 'o, m', 'y na', 'me i', 's fo', 'o???']
@Stidgeon я говорил, что я не хочу, метод textwrap.wrap :) – Etgar
Как вы хотите, чтобы это было обработано, когда строка не может быть разделена поровну ? Например, если длина строки равна 9, и вы хотите, чтобы 4 части хотели, чтобы части имели длины [3, 2, 2, 2]? Вы хотите ошибку. Вы хотите, чтобы большая часть была в начале или в конце? –
Проголосовал за повторное открытие, потому что связанный вопрос задавал четные куски, где этот вопрос задает определенное количество кусков. –