1

I need to isolate all integers from a string, list them, and print their sum and the # of integers. My issue is that my current code will split, for example, 456 into 4, 5, and 6, and treat them as separate integers. Unfortunately regex is not an option.

What i have so far:

def tally(text):
s = ','.join(x for x in text if x.isdigit())
numbers = [int(x) for x in s.split(",")]
num=len(numbers)
t=sum(numbers)
print ('There are', num, 'integers in the input summing up to', t)

.

What i need: input:'34 ch33se 34e8 3.4'
output: [34 33 34 8 3 4 ]
im getting now is [3 4 3 3 8 3 4]
R. Max
  • 6,624
  • 1
  • 27
  • 34
user2782067
  • 382
  • 4
  • 19
  • Have you tried with http://stackoverflow.com/questions/11339210/how-to-get-integer-values-from-a-string-in-python – darmat Sep 15 '13 at 23:37

4 Answers4

1

Here is an one-liner:

>>> s = '34 ch33se 34e8 3.4'
>>> map(int, filter(None, ''.join(map(lambda c: (c.isdigit() and c or ' '), s)).split(' ')))
[34, 33, 34, 8, 3, 4]
R. Max
  • 6,624
  • 1
  • 27
  • 34
0
def get_integers(string):
    current_integer = ""
    for i in string:
        if i.isdigit():
            current_integer += str(i)
        else:
            if current_integer:
                yield int(current_integer)
                current_integer = ""
    if current_integer:
        yield int(current_integer)

# Prints [34, 33, 34, 8, 3, 4]
print([i for i in get_integers('34 ch33se 34e8 3.4')])

You should be able to sum or whatever the result of that.

Waleed Khan
  • 11,426
  • 6
  • 39
  • 70
0

why don't you just create a function that searches the string character by character and grabs digits? Something like this:

def find_numbers(string):
    numbers = []
    usable = True #mark unusable if its inside a word
    latest_number = ''
    for char in string:
        if char in '1234567890' and usable:
            latest_number += char
            continue
        elif latest_number:
            numbers.append(int(latest_number))
            latest_number = ''
        if char in ' ,':
            usable = True
        else:
            usable = False
    if latest_number: numbers.append(int(latest_number))
    return numbers

with this function you can grab numbers easily:

>>> a = 'hello 123 wh3at? 2'
>>> find_numbers(a)
[123, 2]

EDIT:

if you want to include integers that are inside a word:

def find_numbers(string):
    numbers = []
    latest_number = ''
    for char in string:
        if char in '1234567890':
            latest_number += char
        elif latest_number:
            numbers.append(int(latest_number))
            latest_number = ''
    if latest_number: numbers.append(int(latest_number))
    return numbers
Pooya Eghbali
  • 209
  • 2
  • 6
0

An option using itertools.groupby:

>>> from itertools import groupby
>>> s = '34 ch33se 34e8 3.4'
>>>
>>> filter(str.isdigit, (''.join(g) for k,g in groupby(s, key=str.isdigit)))
<filter object at 0x1006ebc50>
>>> list(_)
['34', '33', '34', '8', '3', '4']

This is significantly faster than the accepted answer:

>>> from timeit import timeit
>>> 
>>> setup = """
... from itertools import groupby
... s = '34 ch33se 34e8 3.4'
... """
>>> 
>>> timeit("map(int, filter(None, ''.join(map(lambda c: (c.isdigit() and c or ' '), s)).split(' ')))", setup)
6.1007173559919465
>>> timeit("filter(str.isdigit, (''.join(g) for k,g in groupby(s, key=str.isdigit)))", setup)
1.5044781469914597
arshajii
  • 127,459
  • 24
  • 238
  • 287