2013-09-15 2 views
1

Мне нужно выделить все целые числа из строки, перечислить их и напечатать их сумму и число целых чисел. Моя проблема заключается в том, что мой текущий код будет разбиваться, например, на 456 на 4, 5 и 6 и рассматривать их как отдельные целые числа. К сожалению, регулярное выражение не является вариантом.Отделить целые числа от строки правильно (без регулярного выражения)

Что я до сих пор:

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] 
+0

вы пробовали с http://stackoverflow.com/questions/11339210/how-to-get-integer-values- from-a-string-in-python – darmat

ответ

1

Вот один вкладыш:

>>> 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] 
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')]) 

Вы должны быть в состоянии sum или любой другой результат этого.

0

почему бы вам не просто создать функцию, которая ищет строку посимвольно и захватов цифр? Что-то вроде этого:

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 

с помощью этой функции вы можете получить номер легко:

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

EDIT:

, если вы хотите включить целые числа, которые находятся внутри слова:

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 
+0

Не работает для его примера – TerryA

+0

@Haidro, исправил его. спасибо за упоминание. первая функция захватывает числа (не внутри слова), вторая захватывает все целые числа. –

+0

Хорошо :). Кроме того, 'continue' не требуется. Он автоматически запустит следующий элемент в списке в любом случае – TerryA

0

Опция с использованием 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'] 

Это значительно быстрее, чем принято отвечать:

>>> 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 
Смежные вопросы