Подтвердить что ты не робот

Разделить строку на строки по длине?

Есть ли способ записать строку длиной 4*x символов и вырезать ее в 4 строки, каждый из которых имеет длину x, не зная длины строки?

Например:

>>>x = "qwertyui"
>>>split(x, one, two, three, four)
>>>two
'er'
4b9b3361

Ответ 1

>>> x = "qwertyui"
>>> chunks, chunk_size = len(x), len(x)/4
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ]
['qw', 'er', 'ty', 'ui']

Ответ 2

Я попробовал ответить Alexanders, но получил эту ошибку в Python3:

TypeError: 'float' object cannot be interpreted as an integer

Это потому, что оператор деления в Python3 возвращает float. Это работает для меня:

>>> x = "qwertyui"
>>> chunks, chunk_size = len(x), len(x)//4
>>> [ x[i:i+chunk_size] for i in range(0, chunks, chunk_size) ]
['qw', 'er', 'ty', 'ui']

Обратите внимание на // в конце строки 2, чтобы обеспечить усечение целого числа.

Ответ 3

Вот однострочный, который не обязательно должен знать длину строки заранее:

from functools import partial
from StringIO import StringIO

[l for l in iter(partial(StringIO(data).read, 4), '')]

Если у вас есть файл или сокет, вам не нужна оболочка StringIO:

[l for l in iter(partial(file_like_object.read, 4), '')]

Ответ 4

def split2len(s, n):
    def _f(s, n):
        while s:
            yield s[:n]
            s = s[n:]
    return list(_f(s, n))

Ответ 5

Вот два общих подхода. Вероятно, стоит добавить к вашему собственному либу повторного использования. Первый требует, чтобы элемент был нарезанным, а второй - с любыми итерабельными (но требует, чтобы их конструктор принимал итерацию).

def split_bylen(item, maxlen):
    '''
    Requires item to be sliceable (with __getitem__ defined)
    '''
    return [item[ind:ind+maxlen] for ind in range(0, len(item), maxlen)]
    #You could also replace outer [ ] brackets with ( ) to use as generator.

def split_bylen_any(item, maxlen, constructor=None):
    '''
    Works with any iterables.
    Requires item constructor to accept iterable or alternatively 
    constructor argument could be provided (otherwise use item class)
    '''
    if constructor is None: constructor = item.__class__
    return [constructor(part) for part in zip(* ([iter(item)] * maxlen))]
    #OR: return map(constructor, zip(* ([iter(item)] * maxlen)))
    #    which would be faster if you need an iterable, not list

Таким образом, в случае с темой headstarter используется следующее:

string = 'Baboons love bananas'
parts = 5
splitlen = -(-len(string) // parts) # is alternative to math.ceil(len/parts)

first_method = split_bylen(string, splitlen)
#Result :['Babo', 'ons ', 'love', ' ban', 'anas']

second_method = split_bylen_any(string, splitlen, constructor=''.join)
#Result :['Babo', 'ons ', 'love', ' ban', 'anas']

Ответ 6

Получил трюк re:

In [28]: import re

In [29]: x = "qwertyui"

In [30]: [x for x in re.split(r'(\w{2})', x) if x]
Out[30]: ['qw', 'er', 'ty', 'ui']

Тогда будет func, это может выглядеть так:

def split(string, split_len):
    # Regex: `r'.{1}'` for example works for all characters
    regex = r'(.{%s})' % split_len
    return [x for x in re.split(regex, string) if x]

Ответ 7

  • : param s: str; строка источника
  • : param w: int; ширина для разделения на

Использование модуля textwrap:

PyDocs-textwrap

import textwrap
def wrap(s, w):
    return textwrap.fill(s, w)

: return str:

Вдохновленный Ответ Alexander

структуры PyDocs-данных

def wrap(s, w):
    return [s[i:i + w] for i in range(0, len(s), w)]
  • : return list:

Вдохновленный Эриком:

PyDocs-regex

import re
def wrap(s, w):    
    sre = re.compile(rf'(.{{{w}}})')
    return [x for x in re.split(sre, s) if x]
  • : return list:

Примеры полного кода/Альтернативные методы

Ответ 8

length = 4
string = "abcdefgh"
str_dict = [ o for o in string ]
parts = [ ''.join( str_dict[ (j * length) : ( ( j + 1 ) * length ) ]   ) for j in xrange(len(string)/length  )]

Ответ 9

И для парней, которые предпочитают, чтобы это было более читаемо:

def itersplit_into_x_chunks(string,x=10): # we assume here that x is an int and > 0
    size = len(string)
    chunksize = size//x
    for pos in range(0, size, chunksize):
        yield string[pos:pos+chunksize]

выход:

>>> list(itersplit_into_x_chunks('qwertyui',x=4))
['qw', 'er', 'ty', 'ui']

Ответ 10

Разделение строк требуется во многих случаях, например, в том случае, когда вам нужно сортировать символы указанной строки, заменять символ другим символом и т.д. Но все эти операции могут выполняться со следующими способами разделения строк.

Разделение строк может быть выполнено двумя способами:

  • Нарезка заданной строки на основе длины раскола.

  • Преобразование данной строки в список со списком (str), где символы разбивки строки формируют элементы списка. Затем выполните требуемую операцию и соедините их с "указанным символом между символами исходной строки".join(list), чтобы получить новую обработанную строку.

Ответ 11

l = 'abcdefghijklmn'

def group(l,n):
    tmp = len(l)%n
    zipped = zip(*[iter(l)]*n)
    return zipped if tmp == 0 else zipped+[tuple(l[-tmp:])]

print group(l,3)

Ответ 12

Мое решение

   st =' abs de fdgh  1234 556 shg shshh'
   print st

   def splitStringMax( si, limit):
    ls = si.split()
    lo=[]
    st=''
    ln=len(ls)
    if ln==1:
        return [si]
    i=0
    for l in ls:
        st+=l
        i+=1
        if i <ln:
            lk=len(ls[i])
            if (len(st))+1+lk < limit:
                st+=' '
                continue
        lo.append(st);st=''
    return lo

   ############################

   print  splitStringMax(st,7)
   # ['abs de', 'fdgh', '1234', '556', 'shg', 'shshh']
    print  splitStringMax(st,12)

   # ['abs de fdgh', '1234 556', 'shg shshh']