我想从python中的N位数字取第n位数。例如:
number = 9876543210
i = 4
number[i] # should return 6
我怎样才能在python中做类似的事情?我应该先将其更改为字符串,然后将其更改为int以进行计算吗?
答案 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)