Как я могу получить первые две цифры числа?

Я хочу проверить первые две цифры числа в Python. Что-то вроде этого:

for i in range(1000):

    if(first two digits of i == 15):
        print("15")

    elif(first two digits of i == 16):
        print("16")

Есть ли команда для проверки первых двух цифр числа? Я бы хотел избежать команд вроде if(i>149 and i<160):...

Ответ 1

Вы можете преобразовать свой номер в строку и нарезать список списков следующим образом:

int(str(number)[:2])

Вывод:

>>> number = 1520
>>> int(str(number)[:2])
15

Ответ 2

Оба предыдущих двух ответа имеют как минимум O (n) временную сложность, а преобразование строк также имеет сложность пространства O (n). Здесь решение для постоянного времени и пространства:

num // 10 ** (int(math.log(num, 10)) - 1)

Функция:

import math

def first_n_digits(num, n):
    return num // 10 ** (int(math.log(num, 10)) - n + 1)

Вывод:

>>> first_n_digits(123456, 1)
1
>>> first_n_digits(123456, 2)
12
>>> first_n_digits(123456, 3)
123
>>> first_n_digits(123456, 4)
1234
>>> first_n_digits(123456, 5)
12345
>>> first_n_digits(123456, 6)
123456

Вам нужно будет добавить некоторые проверки, если возможно, что ваш номер ввода имеет меньше цифр, чем вы хотите.

Ответ 3

Вы можете использовать регулярное выражение для проверки соответствия и записи первых двух цифр:

import re

for i in range(1000):
    match = re.match(r'(1[56])', str(i))

    if match:
        print(i, 'begins with', match.group(1))

Регулярное выражение (1[56]) соответствует 1, за которым следует либо 5, либо 6 и сохраняет результат в первой группе захвата.

Вывод:

15 begins with 15
16 begins with 16
150 begins with 15
151 begins with 15
152 begins with 15
153 begins with 15
154 begins with 15
155 begins with 15
156 begins with 15
157 begins with 15
158 begins with 15
159 begins with 15
160 begins with 16
161 begins with 16
162 begins with 16
163 begins with 16
164 begins with 16
165 begins with 16
166 begins with 16
167 begins with 16
168 begins with 16
169 begins with 16

Ответ 4

Сравнение решения O (n) по времени с решением O (1) "с постоянным временем", представленным в других ответах, показывает, что если алгоритм O (n) достаточно быстр, n, возможно, придется стать очень большим, прежде чем он станет медленнее, чем медленный O (1).

Струнная версия ок. На 60% быстрее, чем версия " математика " для чисел, состоящих из 20 или менее цифр. Они становятся ближе только тогда, когда число цифр приближается к 200 цифрам.

# the "maths" version
import math

def first_n_digits1(num, n):
    return num // 10 ** (int(math.log(num, 10)) - n + 1)

%timeit first_n_digits1(34523452452, 2)
1.21 µs ± 75 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit first_n_digits1(34523452452, 8)
1.24 µs ± 47.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# 22 digits
%timeit first_n_digits1(3423234239472523452452, 2)
1.33 µs ± 59.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit first_n_digits1(3423234239472523452452, 15)
1.23 µs ± 61.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# 196 digits
%timeit first_n_digits1(3423234239472523409283475908723908723409872390871243908172340987123409871234012089172340987734507612340981344509873123401234670350981234098123140987314509812734091823509871345109871234098172340987125988123452452, 39)
1.86 µs ± 21.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

# The "string" verions
def first_n_digits2(num, n):
    return int(str(num)[:n])

%timeit first_n_digits2(34523452452, 2)
744 ns ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit first_n_digits2(34523452452, 8)
768 ns ± 42.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# 22 digits
%timeit first_n_digits2(3423234239472523452452, 2)
767 ns ± 33.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%timeit first_n_digits2(3423234239472523452452, 15)
830 ns ± 55.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

# 196 digits
%timeit first_n_digits2(3423234239472523409283475908723908723409872390871243908098712340987123401208917234098773450761234098134450987312340123467035098123409812314098734091823509871345109871234098172340987125988123452452, 39)
1.87 µs ± 140 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)