Skip to content Skip to sidebar Skip to footer

Slice A Binary Number Into Groups Of Five Digits

Is there any neat trick to slice a binary number into groups of five digits in python? '00010100011011101101110100010111' => ['00010', '00110', '10111', ... ] Edit: I want to wr

Solution 1:

>>> a='00010100011011101101110100010111'>>> [a[i:i+5] for i inrange(0, len(a), 5)]
['00010', '10001', '10111', '01101', '11010', '00101', '11']

Solution 2:

>>> [''.join(each) for each inzip(*[iter(s)]*5)]
['00010', '10001', '10111', '01101', '11010', '00101']

or:

>>> map(''.join, zip(*[iter(s)]*5))
['00010', '10001', '10111', '01101', '11010', '00101']

[EDIT]

The question was raised by Greg Hewgill, what to do with the two trailing bits? Here are some possibilities:

>>> from itertools import izip_longest
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue=''))
['00010', '10001', '10111', '01101', '11010', '00101', '11']
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue=' '))
['00010', '10001', '10111', '01101', '11010', '00101', '11   ']
>>>
>>> map(''.join, izip_longest(*[iter(s)]*5, fillvalue='0'))
['00010', '10001', '10111', '01101', '11010', '00101', '11000']

Solution 3:

Another way to group iterables, from the itertools examples:

defgrouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

Solution 4:

Solution 5:

How about using a regular expression?

>>> import re
>>> re.findall('.{1,5}', '00010100011011101101110100010111')
['00010', '10001', '10111', '01101', '11010', '00101', '11']

This will break though if your input string contains newlines, that you want in the grouping.

Post a Comment for "Slice A Binary Number Into Groups Of Five Digits"