Можно ли разбить строку на каждый n-й символ?
Например, предположим, у меня есть строка, содержащая следующее:
'1234567890'
Как я могу заставить это выглядеть так:
['12','34','56','78','90']
>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
Просто чтобы быть полным, вы можете сделать это с помощью регулярного выражения:
Для нечетного числа символов вы можете сделать это:
Вы также можете сделать следующее, чтобы упростить регулярное выражение для длинных кусков:
И вы можете использовать,
re.finditer
если строка длинная, чтобы генерировать чанк по чанку.источник
'.'*n
чтобы было понятнее. Нет соединения, нет застегивания, нет петель, нет понимания списка; просто найдите следующие два символа рядом друг с другом, что именно так думает человеческий мозг. Если бы Монти Пайтон был еще жив, ему бы понравился этот метод!flags=re.S
.Для этого в Python уже есть встроенная функция.
Вот что говорит документация для упаковки:
источник
wrap
может не вернуть то, что запрашивается, если строка содержит пробел. например,wrap('0 1 2 3 4 5', 2)
возвращается['0', '1', '2', '3', '4', '5']
(элементы удалены)Еще один распространенный способ группировки элементов в группы n-длины:
Этот метод идет прямо из документов для
zip()
.источник
zip(*[iter(s)]*2)
сложным для понимания, прочитайте, Какzip(*[iter(s)]*n)
работает в Python? ,>>> map(''.join, zip(*[iter('01234567')]*5))
->['01234']
zip()
наitertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
maps()
Я думаю, что это короче и более читабельно, чем версия itertools:
источник
Мне нравится это решение:
источник
Использование more-itertools из PyPI:
источник
Вы можете использовать
grouper()
рецепт изitertools
:Python 2.x:
Python 3.x:
Эти функции экономят память и работают с любыми итерациями.
источник
Попробуйте следующий код:
источник
yield ''.join(piece)
его, чтобы он работал должным образомисточник
Попробуй это:
Вывод:
источник
Как всегда, для тех кто любит лайнеры
источник
print(line)
я получаюthis is a line split into n characters
в качестве вывода. Может вам лучше поставить:line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
? Исправьте это, и это хороший ответ :).,blah
и почему это необходимо? Я заметил, что могу заменитьblah
любым альфа-символом / символами, но не цифрами, и не могу удалитьblah
запятую или / или. Мой редактор предлагает добавить пробел после,
: senumerate
возвращает два итерируемых элемента, поэтому для их размещения необходимо два места. Но вам на самом деле не нужна вторая итерация для чего-либо в этом случае.blah
предпочитать использовать подчеркивание или двойное подчеркивание, см .: stackoverflow.com/questions/5893163/…Простое рекурсивное решение для короткой строки:
Или в такой форме:
, который более подробно иллюстрирует типичную модель «разделяй и властвуй» в рекурсивном подходе (хотя практически нет необходимости делать это таким образом)
источник
Я застрял в том же сценарии.
Это сработало для меня
Вывод
источник
more_itertools.sliced
было упомянуто ранее. Вот еще четыре варианта изmore_itertools
библиотеки:Каждый из последних вариантов выдает следующий результат:
Документация для обсуждаемых вариантов:
grouper
,chunked
,windowed
,split_after
источник
Это может быть достигнуто простым циклом for.
Вывод выглядит как ['12', '34', '56', '78', '90', 'a']
источник