Reputation: 69
How do I split a number into two without any arithmetic in python? For example, the table below:
20670005000000
30003387889032
44555008000004
I want the string to look like the columns below after splitting (and remain numbers that can be used in numerical analysis):
2067000 5000000
3000338 7889032
4455500 8000004
What's the neatest way to do this in Python? Is there a python module that deals with this directly?
Upvotes: 2
Views: 12237
Reputation: 23753
Assuming str.len()
does not involve arithmetic and comparing two integers (2 > 3
) is NOT arithmetic:
import collections
n = 20670005000000
left = collections.deque(str(n))
right = collections.deque()
while len(left) > len(right):
right.appendleft(left.pop())
left = int(''.join(left))
right = int(''.join(right))
Upvotes: 1
Reputation: 6781
Assuming the number should be divided exactly at center
each time, we can use string
and slicing
of it to get the two numbers.
Doing with single number here :
>>> s = str(20670005000000)
>>> l = int(len(s)/2)
>>> a,b = s[:l],s[l:]
>>> int(a)
=> 2067000
>>> int(b)
=> 5000000
Here, for the List of numbers :
for ele in map(str,arr):
l = int( len(ele)/2 )
a,b = ele[:l], ele[l:]
print(int(a), int(b))
# driver values
IN : arr = [20670005000000, 30003387889032, 44555008000004]
OUT : 2067000 5000000
3000338 7889032
4455500 8000004
Upvotes: 0
Reputation: 6121
you could map the int to str, then split it. remember convert it back to int
data = [20670005000000,
30003387889032,
44555008000004,]
str_data = map(str, data)
res = map(lambda x: [x[:len(x)//2],x[len(x)//2:]], str_data )
res = map(int, reduce(lambda x,y: x+y, res) )
print res
output:
[2067000, 5000000, 3000338, 7889032, 4455500, 8000004]
Upvotes: 1
Reputation: 71451
It seems that the existing pattern of operation in this problem is to divide each string value in half.
import re
s = [20670005000000, 30003387889032, 44555008000004]
final_string = [map(int, re.findall('.{'+str(len(str(i))//2)+'}', str(i))) for i in s]
Output:
[[2067000, 5000000], [3000338, 7889032], [4455500, 8000004]]
Upvotes: 0
Reputation: 71
I don't know if it is the best way, but you can convert to string, than split it, and convert it to integer again:
number = (int(str(number)[:len(number)/2]), int(str(number)[len(number)/2:]))
This will give you a touple which you can use later. You can further optimize this by using list comprehension.
Upvotes: 2
Reputation: 2306
This is a possible way:
N = 10000000
i = 20670005000000
# The first part of the number i
i // N
# the second part
i % N
Upvotes: 4