Split string into strings by length?

后端 未结 15 2088
半阙折子戏
半阙折子戏 2020-11-27 06:31

Is there a way to take a string that is 4*x characters long, and cut it into 4 strings, each x characters long, without knowing the length of the s

相关标签:
15条回答
  • 2020-11-27 07:12

    Here are two generic approaches. Probably worth adding to your own lib of reusables. First one requires the item to be sliceable and second one works with any iterables (but requires their constructor to accept iterable).

    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's constructor to accept iterable or alternatively 
        constructor argument could be provided (otherwise use item's 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
    

    So, in topicstarter's case, the usage is:

    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']
    
    0 讨论(0)
  • 2020-11-27 07:13
    some_string="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    x=3 
    res=[some_string[y-x:y] for y in range(x, len(some_string)+x,x)]
    print(res)
    

    will produce

    ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZ']
    
    0 讨论(0)
  • 2020-11-27 07:15

    And for dudes who prefer it to be a bit more readable:

    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]
    

    output:

    >>> list(itersplit_into_x_chunks('qwertyui',x=4))
    ['qw', 'er', 'ty', 'ui']
    
    0 讨论(0)
提交回复
热议问题