我正在尝试创建一个程序,以从左到右的顺序读取数字中所有n对的乘积
例如,数字2345678:
我已完成该问题的大部分解决方案,但无法创建可适应任何n值的操作
num = 2345678
num = str(num)
n = 2
start_pos = 0
for i in range(start_pos,len(num)):
try:
x += 1
t = int(num[i]) * int(num[i+1]) # hardcoded for n = 2
print(t)
start_pos += 1
except IndexError:
break
n = 2
:t = int(num[i]) * int(num[i+1])
n = 3
:t = int(num[i]) * int(num[i+1]) * int(num[i+2])
n = 4
:t = int(num[i]) * int(num[i+1]) * int(num[i+2]) * int(num[i+3])
n = 5
:t = int(num[i]) * int(num[i+1]) * int(num[i+2]) * int(num[i+3]) * int(num[i+4])
如何创建可以适应任何n值的运算?
答案 0 :(得分:2)
如果您想要一个不使用任何pythonic运算符的迭代解决方案,则只需添加一个内部for
即可从i
迭代到i+n
,然后将数字乘积累加到变量t
。像这样:
num = 2345678
num = str(num)
n = 3
start_pos = 0
x = 0
for i in range(start_pos,len(num)):
try:
t = 1
for j in range(i, i+n):
t = t * int(num[j])
print(t)
except IndexError:
break
输出:
24
60
120
210
336
答案 1 :(得分:1)
听起来像是递归的典型问题:
def recurse(int_list, times):
if times == 0:
return 1
else:
return int(int_list[0]) * recurse(int_list[1:], times - 1)
num = 2345678
num_string = str(num)
n = 5
recurse(num_string, n)
答案 2 :(得分:1)
您可以使用循环类似地进行此操作:
def products(num, n):
num = str(num)
digits = [int(digit) for digit in num]
out = []
for i in range(0, len(num)-n+1):
product = 1
for digit in digits[i:i+n]:
product *= digit
out.append(product)
return out
print(products(num, 3))
# [24, 60, 120, 210, 336]
或者,使用更高级的功能:
import operator
from functools import reduce
def products2(num, n):
num = str(num)
digits = list(map(int, num))
out = [reduce(operator.mul, digits[i:i+n]) for i in range(0, len(num)-n+1)]
return out
print(products2(num, 3))
# [24, 60, 120, 210, 336]
答案 3 :(得分:0)
函数functools.reduce
旨在对列表中的连续对进行操作:
from functools import reduce
number = 2345678
numbers = [int(i) for i in str(number)]
product = reduce((lambda x,y : x*y), numbers)
答案 4 :(得分:0)
这可以使用递归来完成:
num = 23456789
num = str(num)
n = 2
start_pos = 0
def nvalues(num, n):
if n == 0:
return 1
else:
return int(num[i]) * nvalues(num[1:], n-1)
for i in range(start_pos,len(num)):
try:
val = nvalues(num, n)
print val
except IndexError:
break
答案 5 :(得分:0)
您可以使用以下功能:
from itertools import starmap
from operator import mul
from functools import reduce
def func(number, n):
nums = [int(i) for i in str(number)]
z = zip(*[nums[i:] for i in range(n)])
r = starmap(lambda *x: reduce(mul, x), z)
return list(r)
print(func(2345678, 2))
# [6, 12, 20, 30, 42, 56]
print(func(2345678, 3))
# [24, 60, 120, 210, 336]