Saph_1991
Saph_1991

Reputation: 33

Splitting a Python string every nth character iterating backwards

I'm working on a program that converts numbers to binary and vice versa. When the user enters a binary string such as 1011110110 it's converted to decimal and printed. I also want to print out the users inputted string like 10 1111 0110.

I have tried

print("Binary \t=\t " + ' '.join(binaryString[i:i+4] for i in range(0, len(binaryString), 4)))

Which will print out as 1011 1101 10. I'm wanting the spaces to start at the end of the string working forward like 10 1111 0110.

Upvotes: 3

Views: 391

Answers (4)

Alain T.
Alain T.

Reputation: 42133

You could use a recursive approach:

def rGroup(S,size=4,sep=" "):
    return S if len(S)<=size else rGroup(S[:-size],size,sep) + sep + S[-size:]

output:

rGroup('1010101010') # '10 1010 1010'

rGroup('12345678',3,',') # '12,345,678'

binaryString = "1011110110"    
print("Binary \t=\t " + rGroup(binaryString)) # Binary  =    10 1111 0110

Upvotes: 2

Szymon Kowaliński
Szymon Kowaliński

Reputation: 582

Just add [::-1] in two places in your code:

' '.join(binaryString[::-1][i:i+4] for i in range(0, len(binaryString), 4))[::-1]

p.s [::-1] reverse the string, so you just reverse it, add spaces in your way and then reverse again to proper initial order.

Upvotes: 1

NickHilton
NickHilton

Reputation: 682

You need to work out where to start your cursor to print out the correct number at the start

string_length = len(binaryString)

# Start position is the remainder when dividing by 4
start_pos = string_length % 4

output_items = []

# Get first item
if start_pos > 0:
 output_items.append(binaryString[0:start_pos])

# Go through the remainder of the string
for i in range(start_pos, string_length, 4):
 output_items.append(binaryString[i:i+4])

print("Binary \t=\t " + ' '.join(output_items))

Upvotes: 0

Patrick Artner
Patrick Artner

Reputation: 51673

You can use the module % operator to know how many "overflow" numbers you have, then partition the remainder every 4th:

def  neat_print(s):
    ls = len(s)
    start = ls % 4
    rv, s = s[:start], s[start:]
    return ' '.join([rv] + [s[i:i+4] for i in range(0,ls-start,4)]).strip()

for k in ["1010101010"[:end] for end in range(2,10)]:
    print(k, "->", neat_print(k))

Output:

10 -> 10
101 -> 101
1010 -> 1010
10101 -> 1 0101
101010 -> 10 1010
1010101 -> 101 0101
10101010 -> 1010 1010
101010101 -> 1 0101 0101

Upvotes: 2

Related Questions