2

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?

asked Oct 12, 2017 at 14:51
5
  • 1
    They look like substrings to me... maybe this will help. To string > substring > parse int Commented Oct 12, 2017 at 14:53
  • 1
    or even this one Commented Oct 12, 2017 at 14:54
  • str(a)[:len(str(a))/2], str(a)[len(str(a))/2:], and a=20670005000000 Commented Oct 12, 2017 at 15:01
  • If the number is converted into a string and its length determined with len is that considered arithmetic? Commented Oct 12, 2017 at 15:15
  • have another idea Commented Oct 12, 2017 at 15:20

6 Answers 6

4

This is a possible way:

N = 10000000
i = 20670005000000
# The first part of the number i
i // N
# the second part
i % N
answered Oct 12, 2017 at 14:56
1
  • 1
    OP says: "without any arithmetic" Commented Oct 12, 2017 at 14:57
2

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.

answered Oct 12, 2017 at 14:56
1

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]
answered Oct 12, 2017 at 14:59
2
  • Is integer divide by two (len(x)//2) arithmetic? Commented Oct 12, 2017 at 15:25
  • @wwii it is trying to find middle point. it can hard-coded, if op wants a fixed length Commented Oct 12, 2017 at 15:26
1

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))
answered Oct 12, 2017 at 15:30
0

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]]
answered Oct 12, 2017 at 14:59
0

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
answered Oct 12, 2017 at 14:58

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.