-1

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?

Lex
  • 39
  • 1
  • 2

6 Answers6

1

This is a possible way:

N = 10000000
i = 20670005000000

# The first part of the number i
i // N
# the second part
i % N
elzell
  • 2,028
  • 1
  • 11
  • 24
0

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.

Boris M
  • 31
  • 3
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
Kaushik NP
  • 6,188
  • 8
  • 29
  • 57
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]]
Ajax1234
  • 58,711
  • 7
  • 46
  • 83
0

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]
galaxyan
  • 5,119
  • 2
  • 15
  • 36
0

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))
wwii
  • 19,802
  • 6
  • 32
  • 69