Разделить строку на каждый n-й символ? - PullRequest
318 голосов
/ 28 февраля 2012

Можно ли разбить строку питона на каждый n-й символ?

Например, предположим, у меня есть строка, содержащая следующее:

'1234567890'

Как мне заставить его выглядеть так:

['12','34','56','78','90']

Ответы [ 23 ]

4 голосов
/ 28 февраля 2012

Попробуйте следующий код:

from itertools import islice

def split_every(n, iterable):
    i = iter(iterable)
    piece = list(islice(i, n))
    while piece:
        yield piece
        piece = list(islice(i, n))

s = '1234567890'
print list(split_every(2, list(s)))
2 голосов
/ 20 мая 2016

Как всегда, для тех, кто любит один лайнер

n = 2  
line = "this is a line split into n characters"  
line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
1 голос
/ 20 мая 2019

Этот вопрос напоминает мне метод Perl 6 .comb(n). Он разбивает строки на куски размером n. (Это еще не все, но я опущу детали.)

Достаточно просто реализовать подобную функцию в Python3 как лямбда-выражение:

comb = lambda s,n: [s[i:i+n] for i in range(0,len(s),n)]

Тогда вы можете назвать это так:

comb('1234567', 2)   # returns ['12', '34', '56', '7']

Эта comb() функция также будет работать со списками (для создания списка списков):

comb(['cat', 'dog', 'bird'], 2)  # returns [['cat', 'dog'], ['bird']]
1 голос
/ 01 июня 2016

У меня есть этот код, который я использую всякий раз, когда мне нужно сделать это:

def split_string(n, st):
    lst = [""]
    for i in str(st):
        l = len(lst) - 1
        if len(lst[l]) < n: 
            lst[l] += i
        else:
            lst += [i]
    return lst

print(split_string(3, "test_string."))

Где:

  • n - длина каждого элемента списка
  • st - строка, которую нужно разделить
  • lst - список версий st
  • i - текущий символ, используемый в st
  • l - длина последнего элемента списка
0 голосов
/ 20 июня 2019

Это может быть немного яснее

##Define your string
mystring = '1234567890'

##Define your starting index
start = 0
##Define the end of your index for the first slice
end = 2

##Create an empty list
mylist =[]

##While the slice of characters without white space has something in it keep going
while len(mystring[start:end])>0:
    ##Add to the list
    mylist.append(mystring[start:end])
    ##Move the index up for the begining and ending of the slice
    start+=2
    end+=2
0 голосов
/ 11 января 2019

Одна из возможностей - использовать регулярные выражения:

import re
re.findall("\w{3}", your_string)
0 голосов
/ 22 октября 2018

Простое рекурсивное решение для короткой строки:

def split(s, n):
    if len(s) < n:
        return []
    else:
        return [s[:n]] + split(s[n:], n)

print(split('1234567890', 2))

Или в такой форме:

def split(s, n):
    if len(s) < n:
        return []
    elif len(s) == n:
        return [s]
    else:
        return split(s[:n], n) + split(s[n:], n)

, которая более явно иллюстрирует типичный шаблон «разделяй и властвуй» в рекурсивном подходе (хотя делать это практически не нужно)

0 голосов
/ 30 июня 2018

Я знаю, что этот вопрос старый, но это самый короткий способ сделать это, я знаю:

def split_every_n(S, n):
  return [S[i*n:(i+1)*n] for i in range(len(S) / n)]

Это, однако, предполагает, что длина вашей строки кратна n,В противном случае вам придется его дополнить.

0 голосов
/ 21 мая 2016

Жуткий & ndash; попытался придумать еще один ответ:

def split(s, chunk_size):
    a = zip(*[s[i::chunk_size] for i in range(chunk_size)])
    return [''.join(t) for t in a]

print(split('1234567890', 1))
print(split('1234567890', 2))
print(split('1234567890', 3))

Out

['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
['12', '34', '56', '78', '90']
['123', '456', '789']
0 голосов
/ 09 февраля 2018

more_itertools.sliced было упомянуто ранее.Вот еще четыре параметра из библиотеки more_itertools:

s = "1234567890"

["".join(c) for c in mit.grouper(2, s)]

["".join(c) for c in mit.chunked(s, 2)]

["".join(c) for c in mit.windowed(s, 2, step=2)]

["".join(c) for c in  mit.split_after(s, lambda x: int(x) % 2 == 0)]

Каждый из последних вариантов дает следующий вывод:

['12', '34', '56', '78', '90']

Документация для обсуждаемых вариантов: grouper, chunked, windowed, split_after

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...