Извлечь из строки числа

Дана строка, содержащая натуральные числа и слова. Необходимо сформировать список из чисел, содержащихся в этой строке. Например, задана строка "abc83 cde7 1 b 24". На выходе мы должны получить список [83, 7, 1, 24].

Решение задачи на языке программирования Python

Следует посимвольно перебирать строку. Если очередной символ цифра, надо добавить ее в новую строку. Далее проверять символы за ней, и если они тоже цифры, то добавлять их в конец этой новой подстроки из цифр. Когда очередной символ окажется не цифрой, или будет достигнут конец строки, то надо преобразовать строку из цифр в число и добавить в список.

s = input()

length = len(s)
integers = []
i = 0  # индекс текущего символа

while i < length:
    s_int = ''  # строка для нового числа
    while i < length and '0' <= s[i] <= '9':
        s_int += s[i]
        i += 1
    i += 1
    if s_int != '':
        integers.append(int(s_int))

print(integers)

5 dkfj78df 9 8 dkfj8
[5, 78, 9, 8, 8]

Обратите внимание, что данное решение извлекает именно числа, а не цифры. Иначе мы бы не получили число 78, а получили отдельно цифру 7 и цифру 8. Задача на извлечение цифр существенно проще.

Решение через цикл for:

a = input()
num_list = []

num = ''
for char in a:
    if char.isdigit():
        num = num + char
    else:
        if num != '':
            num_list.append(int(num))
            num = ''
if num != '':
    num_list.append(int(num))

print(num_list)

Если в строке числа всегда отделены от слов пробелами, задача решается проще:

s = input()
word_list = s.split()
num_list = []

for word in word_list:
    if word.isnumeric():
        num_list.append(int(word))

print(num_list)

Здесь происходит разделение строки на слова по пробелам. В цикле с помощью метода isnumeric каждое слово проверяется, является ли оно числом. Подобную задачу можно решить в одну строку, если использовать функцию filter.

s = input()
word_list = s.split()

num_list = [int(num) for num in filter(
    lambda num: num.isnumeric(), word_list)]

print(num_list)

В функцию filter передается лямбда-выражение, проверяющее слова, и список слов. Функция возвращает список строк-чисел. Далее с помощью генератора списка строки преобразовываются в целочисленный тип.

На практике при решении подобных задач, когда надо найти и извлечь из строки что-либо, обычно пользуются регулярными выражениями. В примере ниже не обязательно, чтобы число было отделено пробелами.

import re

s = input()

nums = re.findall(r'\d+', s)

nums = [int(i) for i in nums]

print(nums)

Для поиска вещественных чисел:

import re

s = input()

nums = re.findall(r'\d*\.\d+|\d+', s)

nums = [float(i) for i in nums]

print(nums)


Решение задач на Python




Все разделы сайта