Thomas Schwärzl
Thomas Schwärzl

Reputation: 9917

format string to be more human readable

I'm looking for a more elegant way to format a string into a human readable syntax.

>>> a = 'ABCDEFGHIJKLMNOPQRSTUVWX'
>>> # magic
>>> print(a)
'ABCD-EFGH-IJKL-MNOP-QRST-UVWX'

What I got so far:

>>> a = 'ABCDEFGHIJKLMNOPQRSTUVWX'
>>> b = map(''.join, zip(*[iter(a)]*4))
>>> print(b)
['ABCD', 'EFGH', 'IJKL', 'MNOP', 'QRST', 'UVWX']
>>> c = '-'.join(b)
>>> print(c)
'ABCD-EFGH-IJKL-MNOP-QRST-UVWX'

Upvotes: 0

Views: 218

Answers (2)

Hugh Bothwell
Hugh Bothwell

Reputation: 56674

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def make_elegant(s, groupsize=4, joiner='-', pad=''):
    return joiner.join(''.join(block) for block in grouper(s, groupsize, pad))

print make_elegant('ABCDEFGHIJKLMNOPQRSTUVWX')

returns

ABCD-EFGH-IJKL-MNOP-QRST-UVWX

Upvotes: 2

jabaldonedo
jabaldonedo

Reputation: 26582

You can do it in one line with this:

>>> a = 'ABCDEFGHIJKLMNOPQRSTUVWX'
>>> "-".join([a[i:i+4] for i in range(len(a)/4)])
 'ABCD-BCDE-CDEF-DEFG-EFGH-FGHI'

In python 3 use: "-".join([a[i:i+4] for i in range(int(len(a)/4))])

Upvotes: 3

Related Questions