Получение цифр числа средствами Python: все способы с примерами

Раздел: Математика -> Работа с цифрами

Разбиение числа на отдельные цифры - часто встречающаяся задача при работе с математическими операциями, проверке свойств чисел (например, палиндромы, сумма цифр) и обработке данных. В Python существует несколько способов получить список цифр из целого или дробного числа. В этой статье рассмотрим различные подходы, их преимущества и недостатки, а также типичные ошибки.

Методы разбиения числа на цифры

Как разбить число на цифры с помощью преобразования в строку?

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

number = 12345
digits = [int(d) for d in str(number)]
print(digits)  # [1, 2, 3, 4, 5]

вторая цифра числа python (получение второй цифры числа в python)

Для дробного числа можно разбить на целую и дробную части, а затем объединить.

Типичные проблемы:

  • Отрицательное число: символ '-' войдет в список. Решение: применить abs(number) перед преобразованием.
  • Дробные числа: точка '.' также станет элементом. Решение: отфильтровать нецифровые символы или предварительно обработать число.

Как получить цифры числа без использования строк?

Алгоритм: на каждом шаге берём последнюю цифру через остаток от деления на 10, а затем целочисленно делим число на 10, пока оно не станет нулём. Метод работает только для целых неотрицательных чисел. Для отрицательных сначала нужно взять модуль.

def digits_math(n):
    n = abs(n)
    dig = []
    while n > 0:
        dig.append(n % 10)
        n //= 10
    return dig[::-1]  # разворачиваем, так как цифры собирались с конца

print(digits_math(12345))  # [1, 2, 3, 4, 5]

Python срез числа (извлечение части числа (срез цифр) в python)

Проблемы:

  • Если число равно 0, то цикл не выполнится, вернётся пустой список. Решение: обработать случай n == 0 отдельно.
  • Порядок цифр обратный, требуется разворот.

Как компактно разбить число на цифры с помощью map?

Функция map применяет int к каждому символу строкового представления числа. Результат - итератор, который можно преобразовать в список.

number = 6789
digits = list(map(int, str(number)))
print(digits)  # [6, 7, 8, 9]

число в обратном порядке python (переворот числа (обратный порядок цифр) в python)

Та же проблема с отрицательными и дробными числами, что и в первом методе.

Как разбить число на цифры рекурсивно?

Рекурсивная функция отделяет последнюю цифру и вызывает себя для уменьшенного числа. Условие остановки - число меньше 10.

def digits_rec(n):
    n = abs(n)
    if n < 10:
        return [n]
    return digits_rec(n // 10) + [n % 10]

print(digits_rec(98765))  # [9, 8, 7, 6, 5]

сколько цифр в числе python (подсчёт количества цифр в числе в python)

Проблема: глубина рекурсии ограничена (примерно 1000 уровней), поэтому для очень больших чисел может возникнуть RecursionError. При отрицательных числах знак теряется.

Как применить divmod для извлечения цифр?

Встроенная функция divmod возвращает частное и остаток от деления. Это удобно в цикле: пока число не равно нулю.

def digits_divmod(n):
    n = abs(n)
    dig = []
    while n:
        n, rem = divmod(n, 10)
        dig.append(rem)
    return dig[::-1]

print(digits_divmod(2468))  # [2, 4, 6, 8]

минимальная цифра числа python (поиск минимальной цифры в числе в python)

Требуется разворот списка, как и в чисто математическом варианте. Тот же случай с нулём.

Как разбить дробное число на цифры целой и дробной части?

Дробное число можно представить как строку, убрать точку и преобразовать символы. Либо использовать Decimal для точности.

from decimal import Decimal
num = 12.345
# Преобразование в строку
str_num = str(num).replace('.', '')
digits = [int(ch) for ch in str_num if ch.isdigit()]
print(digits)  # [1, 2, 3, 4, 5]

# Используя Decimal
d = Decimal(str(num))
integer_part = int(d)  # целая часть
fraction_part = d - integer_part  # дробная часть в виде Decimal
digits_int = [int(x) for x in str(integer_part)]
digits_frac = [int(x) for x in str(fraction_part)[2:]]  # пропускаем '0.'
print(digits_int, digits_frac)  # [1, 2] [3, 4, 5]

разбить число python (разбиение числа на цифры в python)

Проблема: представление числа в строке может содержать научную нотацию (например, 1e-5). Решение: использовать Decimal с явным указанием точности или форматировать с фиксированным числом знаков.

Как разбить отрицательное число, сохранив знак?

Если нужно получить список цифр без минуса, достаточно взять модуль. Если же нужно сохранить информацию о знаке, можно отдельно запомнить знак и вернуть кортеж (знак, список_цифр).

def split_signed(n):
    sign = 1 if n >= 0 else -1
    digits = [int(d) for d in str(abs(n))]
    return sign, digits

print(split_signed(-123))  # (-1, [1, 2, 3])

Ошибка: при преобразовании abs(n) в строку для n=0 знак теряется. Требуется дополнительная проверка.

Как разбить сразу много чисел на цифры эффективно?

Для больших массивов чисел можно применить numpy векторизованные операции:

import numpy as np

def digits_numpy(numbers):
    # Преобразуем числа в строки и разбиваем на символы
    strs = np.char.mod('%d', numbers)
    # Собираем списки цифр (каждый элемент - массив символов)
    digits_list = [list(map(int, list(s))) for s in strs]
    return digits_list

nums = np.array([123, 456, 789])
print(digits_numpy(nums))  # [[1,2,3],[4,5,6],[7,8,9]]

Не работает для отрицательных и дробных чисел без дополнительной обработки. Требуется установка numpy.

Расширенные примеры разбиения числа на цифры

Пример 1: Генератор цифр с использованием divmod

Пример
def digits_generator(n):
    n = abs(n)
    if n == 0:
        yield 0
        return
    while n:
        n, rem = divmod(n, 10)
        yield rem

result = list(reversed(list(digits_generator(321))))
print(result)
[3, 2, 1]

Генератор позволяет экономить память при работе с очень большими числами. Результат собирается через reversed, так как цифры выдаются в обратном порядке.

Пример 2: Разбиение числа с сохранение ведущих нулей (строковый ввод)

Пример
number_str = '00123'
digits = [int(ch) for ch in number_str]
print(digits)
[0, 0, 1, 2, 3]

Если исходные данные представлены строкой (например, номер телефона или код), ведущие нули сохраняются автоматически. Для целого числа такое невозможно, так как int('00123') даст 123.

Пример 3: Разбиение числа в обратном порядке (без разворота)

Пример
def digits_rev(n):
    n = abs(n)
    dig = []
    while n:
        n, rem = divmod(n, 10)
        dig.append(rem)
    return dig  # без разворота

print(digits_rev(12345))
[5, 4, 3, 2, 1]

Иногда порядок цифр не важен, тогда можно не выполнять обратный разворот, что немного ускоряет работу. Этот способ удобен, например, при подсчёте суммы цифр, где порядок не имеет значения.

Пример 4: Разбиение числа с плавающей точкой через Decimal (экспоненциальная форма)

Пример
from decimal import Decimal
num = 1.23e-4
d = Decimal(str(num))
# Извлекаем цифры мантиссы
digits = [int(x) for x in d.as_tuple().digits]
print(digits)
[1, 2, 3]

Метод as_tuple() возвращает кортеж с цифрами мантиссы, что позволяет корректно обработать числа в научной нотации. Обратите внимание: для 1.23e-4 мантисса равна 123.

Пример 5: Поэлементный обход строки с помощью цикла for

Пример
number = 98765
digits = []
for ch in str(number):
    digits.append(int(ch))
print(digits)
[9, 8, 7, 6, 5]

Этот вариант эквивалентен списочному включению, но даёт больше возможностей для дополнительной обработки на каждой итерации (например, пропуск символов или преобразования).

Пример 6: Применение: сумма квадратов цифр числа

Пример
def sum_sq_digits(n):
    return sum(int(d)**2 for d in str(abs(n)))

print(sum_sq_digits(123))  # 1^2 + 2^2 + 3^2 = 14
14

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

Разбиение числа на цифры в Python - comments

En
разбить число python (python)