Перевірте, чи рядок містить число в Python

Вступ

Незалежно від того, чи створюєте ви сценарій перевірки для введення користувачами, форму входу, яка вимагає від користувачів включити символ у пароль, перевірка того, чи містить рядок символ, не є незвичайною операцією.

У цьому підручнику ми розглянемо багато способів перевірити, чи містить рядок цифру/число в Python, включно з тестом для найефективнішого підходу.

Перевірте, чи рядок містить число в Python

Є кілька способів перевірити, чи a характер це число (ord(), isnumeric(), isdigit()), який можна поєднати з циклом for, щоб перевірити принаймні один позитивний результат. Крім того, ви можете використовувати регулярні вирази як загальні збіги шаблонів, які є гнучкими, потужними та призначеними для застосування до великих масивів тексту. Нарешті – завжди можна map() кожному символу дається умовний оператор і повертається True is any() з них призводять до True.

Вибираючи між ними, слід враховувати ефективність методів, багатослівність і стиль кодування, а також завдання, пов’язані з операцією.

Перевірте, чи рядок містить число за допомогою ord()

Команда ord() функція приймає символ і повертає його ASCII значення:

print(ord('0')) 
print(ord('9')) 

Значення ASCII 0 дорівнює 48, а значення ASCII 9 дорівнює 57. Будь-яке число між цими числами буде мають значення ASCII від 48 до 57. Тепер, щоб перевірити, чи містить рядок якесь число, ми пройдемо весь вхідний рядок і перевіримо значення ASCII кожного символу. Якщо значення ASCII більше 47 і менше 58, це означає, що це число, і ми повернемо True:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    ascii_code = ord(ch)
    if 47 < ascii_code < 58:
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Це призводить до:

Yes, the string contains a number.

Перевірте, чи рядок містить число за допомогою isnumeric()

Команда isnumeric() функція повертає True якщо вхідний рядок містить лише числа, інакше повертає False:

str1 = "918"
print("String is whole numeric?", str1.isnumeric())
str2 = "The meaning of the universe is 42"
print("String is whole numeric?", str2.isnumeric())

Це призводить до:

String is whole numeric? True 
String is whole numeric? False

Примітка: Команда isnumeric() функція працюватиме не так, як ви очікували від'ємні числа або числа з плаваючою речовиною. Якщо ми передаємо рядок лише з від’ємними чи числами з плаваючою речовиною, він повернеться False, тому що - та . символи, пов’язані з від’ємними числами та числами з плаваючою точкою, насправді не є числами.

str1 = "-918"
print("String is whole numeric?", str1.isnumeric()) 

str2 = "91.8"
print("String is whole numeric?", str2.isnumeric()) 

Однак, оскільки символи є просто рядками довжини 1 у Python, ви можете перебирати символи та використовувати isnumeric() щоб перевірити, чи є вони числом:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isnumeric():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Перевірте, чи рядок містить число за допомогою isdigit()

Команда isdigit() функція перевіряє, чи всі символи в рядку є цифрами. Якщо так – повертається True, а якщо ні, повертається False. Знову ж таки, оскільки символи є просто рядками довжини 1 у Python, цей метод можна використовувати в циклі для кожного символу:

input_string = "My name is Satyam & I am 22 yrs old"
flag = False
for ch in input_string:
    if ch.isdigit():
        flag = True
        break
if flag:
    print("Yes, the string contains a number.")
else:
    print("No, the string does not contain a number.")

Примітка: Команда isdigit() метод поводиться лише так само, як isnumeric()і якщо ви передаєте рядок, що містить число з плаваючою точкою або від’ємне число, False повертається через те, що спеціальні символи не є числами. Хоча на рівні персонажа, якщо до одного True значення достатньо, щоб визначити, чи містить рядок число – воно застосовне.

Різниця між isnumeric() і isdigit()?

Отже, яка різниця між isnumeric() та isdigit()? Поки ми на цьому – про що isdecimal()?

  • isnumeric() перевіряє, чи є будь-який символ a представлення Юнікоду з числове значення (що включає римські цифри, верхні і нижні індекси та дроби)
  • isdigit() перевіряє, чи є будь-який символ a цифра Unicode (що не включає римські цифри, але включає верхні/нижні індекси та дроби)
  • isdecimal() перевіряє, чи є якісь символи a десяткова цифра (який би повернувся False за все, що не так 0..9 в основі 10)

isnumeric() є найбільш широким методом, при цьому isdecimal() є найвужчим серед трьох.

Перевірте, чи рядок містить число за допомогою map() і any()

Команда map() функція виконує надану функцію для кожного елемента iterable, переданого у функції map. Кожен елемент iterable передається функції як параметр:

map(function, iterable)

Команда function виконується для кожного елемента iterable. Це дозволяє використовувати дуже гнучку та потужну логіку, обмежену лише екстенсивністю function дзвониш на вхід! Метод повертає a map екземпляр, який можна легко перетворити на інші колекції, такі як список або набір.

Ми можемо написати функцію, яка повертає логічне значення, яке визначає, чи є символ числом, і map() таким чином виклик призведе до списку логічних значень.

Команда any() Умови повернення True якщо будь-який елемент переданого iterable є True, інакше повертається False.

Поєднавши ці два разом, ми можемо створити короткий сценарій високого рівня та абстрагувати цикл for:

def func(ch):
    return ch.isdigit() 

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(func, input_string)))
print("Is there a number present?", contains_number)

Це призводить до:

Is there a number present? True

Якщо ваша функція є однорядковою – немає необхідності витягувати її як іменовану функцію. Можна написати анонімно лямбда-функція замість цього для стислості:

Ознайомтеся з нашим практичним практичним посібником із вивчення Git з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди Git і фактично вчитися це!

input_string = "My name is Satyam & I am 22 yrs old"
contains_number = any(list(map(lambda ch: ch.isdigit(), input_string)))
print("Is there any number present?", contains_number)

Це також призводить до:

Is there any number present? True

Перевірте, чи рядок містить число в Python з регулярними виразами

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

Пітона re модуль використовується для написання, компіляції та зіставлення тексту з регулярними виразами. У ньому викриваються різні методи, наприклад match() який відповідає тому, чи починається рядок шаблоном, search() який знаходить перше входження, можливо, багатьох збігів у рядку, і findall() який перевіряє всі випадки.

Примітка: Усі три методи приймають a pattern та search аргумент і запустіть пошук для pattern в search рядок.

Шаблон, який ідентифікує a цифра is "d+":

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.search(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

Команда search() метод повертає a re.Match об'єкт, що містить знайдений збіг і початковий і кінцевий індекси:


Об’єкт можна оцінити як логічне значення залежно від того, чи є він a re.Match об'єкт або None. Це призводить до:

Is there any number present? Yes

На відміну від search() Метод, findall() метод повертає всі входження шаблону, а не лише перше:

import re
input_string = "My name is Satyam & I am 22 yrs old"
match = re.findall(r"d+", input_string)
if match:
    print("Is there any number present?", "Yes")
else:
    print("Is there any number present?", "No")

Це призводить до:

Is there any number present? Yes

порівняльний аналіз

Що щодо продуктивності? Якщо ви вилучите логіку та обріжете непотрібні частини, обмеживши методи лише поверненням результату, ви зможете легко порівняти їх одне з одним на одному вхідному даних:

%timeit ord_check()
%timeit isnumeric_check()
%timeit is_digit_check()
%timeit lambda_check()
%timeit regex_check()

Це призводить до:

2.18 µs ± 51.5 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
2.04 µs ± 639 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
1.88 µs ± 448 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
5.07 µs ± 915 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
1.47 µs ± 3.41 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

Зазвичай підходи циклу for виконуються приблизно в один і той же час, з невеликими витратами на конкретні методи. Лямбда с any() дефакто є найповільнішим (багато надлишкових операцій через перетворення списку на список і подальше його скорочення), тоді як регулярні вирази мали найшвидший час виконання з найменшою дисперсією (вони незмінно швидкі).

Однак у довших текстах введення підкреслюються часові складності для кожного з різних підходів, особливо залежно від кількості відповідних цифр (незалежно від того, чи є цифри звичайними чи ні):

import random
import string

input_string_random = ''.join(random.choices(string.ascii_uppercase + string.digits, k=1000))
print(input_string_random) 

input_string_with_single_digit = ''.join(random.choices(string.ascii_uppercase, k=1000)) + '1'
print(input_string_with_single_digit) 

Перший рядок генерує випадкову послідовність приблизно з рівною кількістю цифр і символів, тоді як останній є лише символьним рядком з однією цифрою в кінці (найгірша часова складність):

%timeit ord_check(input_string_random)
504 ns ± 22.6 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit ord_check(input_string_with_single_digit)
76.2 µs ± 1.36 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit isnumeric_check(input_string_random)
756 ns ± 170 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit isnumeric_check(input_string_with_single_digit)
76.2 µs ± 8.43 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit is_digit_check(input_string_random)
549 ns ± 102 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit is_digit_check(input_string_with_single_digit)
65 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_random)
114 µs ± 8.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit lambda_check(input_string_with_single_digit)
119 µs ± 6.23 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
%timeit regex_check(input_string_random)
996 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit regex_check(input_string_with_single_digit)
22.2 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

З невеликою кількістю звернень регулярні вирази є найефективнішими. З багатьма зверненнями підхід лямбда-функції є найефективнішим, і це зберігає свою часову складність незалежно від того, багато звернень чи одне введення. Основний недолік (надлишкові обчислення, коли рівень попадання низький) перетворюється на його головну перевагу, оскільки надмірність робить його надійним для введення.

Висновок

У цьому посібнику ми розглянули кілька способів перевірити, чи містить рядок у Python хоча б один символ. Ми переглянули ord(), isnumeric(), isdigit() та isdecimal() а також як абстрагувати цю логіку за допомогою виклику лямбда-функції map() та any(). Потім ми досліджували регулярні вирази та порівнювали підходи з різними вхідними даними.

Часова мітка:

Більше від Stackabuse