Python 根据值更改操作长度 上下文
我试图创建一个程序,从左到右读取一个数字中所有n对的乘积 例如,在号码2345678中:Python 根据值更改操作长度 上下文,python,Python,我试图创建一个程序,从左到右读取一个数字中所有n对的乘积 例如,在号码2345678中: 所有2对的乘积将是2*3=6、3*4=12、4*5=20、5*6=30等等 所有3对的乘积将是2*3*4=24、3*4*5=60、4*5*6=120等等 我已经完成了问题的大部分解决方案,但我无法创建一个可以适应任何n值的操作 代码 不同n值的操作 n=2:t=int(num[i])*int(num[i+1]) n=3:t=int(num[i])*int(num[i+1])*int(num[i+2])
- 所有2对的乘积将是2*3=6、3*4=12、4*5=20、5*6=30等等
- 所有3对的乘积将是2*3*4=24、3*4*5=60、4*5*6=120等等
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值的操作呢?听起来像是递归的典型问题:
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)
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
函数
functools.reduce
设计用于对列表中的连续对进行操作:
from functools import reduce
number = 2345678
numbers = [int(i) for i in str(number)]
product = reduce((lambda x,y : x*y), numbers)
您可以使用类似于您尝试的方法,使用循环:
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]
如果您想要一个不使用任何pythonic运算符的迭代解,您可以简单地为添加一个内部
,从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
这可以使用递归实现:
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)
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
您可以使用以下功能:
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]
“int”对象不可下标?不要忘记str()您的数字,就像您在问题的第二行中所做的那样;)从i+1开始,设置t=int(num[i])
相当于我认为更好的方法:从i开始,设置t=1
你是对的。它要优雅得多。我将编辑答案。n=2
返回6,12,20,30,42,56,72,36,8,6
?