如何在python中取一个数字的第n位数

时间:2016-09-22 16:46:31

标签: python int

我想从python中的N位数字取第n位数。例如:

number = 9876543210
i = 4
number[i] # should return 6

我怎样才能在python中做类似的事情?我应该先将其更改为字符串,然后将其更改为int以进行计算吗?

7 个答案:

答案 0 :(得分:37)

您可以使用整数除法和余数方法

def get_digit(number, n):
    return number // 10**n % 10

get_digit(987654321, 0)
# 1

get_digit(987654321, 5)
# 6

//以10的幂进行整数除以将数字移动到1位置,然后%得到除数后的余数10.注意此方案中的编号使用零 - 索引并从数字的右侧开始。

答案 1 :(得分:16)

首先将数字视为字符串

number = 9876543210
number = str(number)

然后得到第一个数字:

number[0]

第四位:

number[3]

编辑:

这会将数字作为字符返回,而不是数字。要将其转换回来,请使用:

int(number[0])

答案 2 :(得分:3)

我对两种流行方法(转换为字符串和使用模块化算术)的相对速度感到好奇,因此我对它们进行了概要分析,并惊讶地发现它们在性能方面有多近。

(我的用例略有不同,我想获取数字中的所有数字。)

字符串方法给出了:

         10000002 function calls in 1.113 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 10000000    1.113    0.000    1.113    0.000 sandbox.py:1(get_digits_str)
        1    0.000    0.000    0.000    0.000 cProfile.py:133(__exit__)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

虽然模块化算术方法给出了:


         10000002 function calls in 1.102 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 10000000    1.102    0.000    1.102    0.000 sandbox.py:6(get_digits_mod)
        1    0.000    0.000    0.000    0.000 cProfile.py:133(__exit__)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

运行了10000000个测试,最大数量小于10000000000000000000000000000。

参考代码:

def get_digits_str(num):
    for n_str in str(num):
        yield int(n_str)


def get_digits_mod(num, radix=10):

    remaining = num
    yield remaining % radix

    while remaining := remaining // radix:
        yield remaining % radix


if __name__ == '__main__':

    import cProfile
    import random

    random_inputs = [random.randrange(0, 10000000000000000000000000000) for _ in range(10000000)]

    with cProfile.Profile() as str_profiler:
        for rand_num in random_inputs:
            get_digits_str(rand_num)

    str_profiler.print_stats(sort='cumtime')

    with cProfile.Profile() as mod_profiler:
        for rand_num in random_inputs:
            get_digits_mod(rand_num)

    mod_profiler.print_stats(sort='cumtime')

答案 3 :(得分:2)

我建议为数字的大小添加布尔检查。我正在将毫秒值转换为datetime。我的数字从2到200,000,200,所以0是有效的输出。 @Chris Mueller拥有的函数即使数字小于10 ** n也会返回0。

def get_digit(number, n):
    return number // 10**n % 10

get_digit(4231, 5)
# 0

def get_digit(number, n):
    if number - 10**n < 0:
        return False
    return number // 10**n % 10

get_digit(4321, 5)
# False

在检查此返回值的布尔状态时,您一定要小心。要允许0作为有效的返回值,您不能仅使用if get_digit:。您必须使用if get_digit is False:来防止0成为错误的值。

答案 4 :(得分:1)

对于坏死线程,我感到非常抱歉,但是我想提供一种不将整数转换为字符串的解决方案。另外,我还想与更多类似计算机的思维一起工作,因此,克里斯·穆勒(Chris Mueller)的回答对我来说还不够好。

因此,事不宜迟,

import math

def count_number(number):
    counter = 0
    counter_number = number
    while counter_number > 0:
        counter_number //= 10
        counter += 1
    return counter


def digit_selector(number, selected_digit, total):
    total_counter = total
    calculated_select = total_counter - selected_digit
    number_selected = int(number / math.pow(10, calculated_select))
    while number_selected > 10:
        number_selected -= 10
    return number_selected


def main():
    x = 1548731588
    total_digits = count_number(x)
    digit_2 = digit_selector(x, 2, total_digits)
    return print(digit_2)


if __name__ == '__main__':
    main()

将打印:

5

希望其他人可能需要这种特定类型的代码。也希望对此有反馈!

这应该找到整数中的任何数字。

缺陷:

工作还不错,但是如果您长时间使用它,那么它将花费越来越多的时间。我认为可以查看是否有成千上万个等,然后从number_selected中减去这些数,但这可能是另一次了;)

用法:

您需要从1到21的每一行。然后,您可以调用第一个count_number使其对您的整数进行计数。

x = 1548731588
total_digits = count_number(x)

然后按以下方式读取/使用digit_selector函数:

digit_selector('在此处插入您的整数','您要拥有哪个数字?(从最左端的数字开始为1)','总共有多少个数字?'

如果我们有1234567890,并且需要选择4,则这是从左数起的第4位数字,因此我们输入“ 4”。

由于使用total_digits,我们知道有多少位数。这很容易。

希望一切都能解释!

Han

PS:特别感谢CodeVsColor提供count_number函数。我使用了以下链接:https://www.codevscolor.com/count-number-digits-number-python帮助我使digit_selector正常工作。

答案 5 :(得分:0)

好的,首先,使用python中的str()函数来转换&#39; number&#39;成为一个字符串

number = 9876543210 #declaring and assigning
number = str(number) #converting

然后以索引表示法获取索引,0 = 1,4 = 3,使用int()将其转回数字

print(int(number[3])) #printing the int format of the string "number"'s index of 3 or '6'

如果您喜欢简短形式

print(int(str(9876543210)[3])) #condensed code lol, also no more variable 'number'

答案 6 :(得分:0)

这是我对这个问题的看法。

我定义了一个函数'index',该函数接受数字和输入的索引,并以所需的索引输出数字。

enumerate方法对字符串进行操作,因此,数字首先转换为字符串。由于Python中的索引从零开始,但是所需的功能要求它从1开始,因此在枚举函数中放置一个1来指示计数器的开始。

def index(number, i):

    for p,num in enumerate(str(number),1):

        if p == i:
            print(num)