Lex
Lex

Reputation: 69

how to split number (not character) into two parts in python

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

Answers (6)

wwii
wwii

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

Kaushik NP
Kaushik NP

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

galaxyan
galaxyan

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

Ajax1234
Ajax1234

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

Boris M
Boris M

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

elzell
elzell

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

Related Questions