[英]Change length of operation depending on a value
我正在嘗試創建一個程序,從左到右讀取所有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值的操作?
如果你想在不使用任何Python的操作迭代求解,你可以簡單地添加一個內部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
聽起來像遞歸的典型問題:
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)
您可以使用循環以類似於您嘗試的方式執行此操作:
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]
功能functools.reduce
旨在對列表中的連續對進行操作:
from functools import reduce
number = 2345678
numbers = [int(i) for i in str(number)]
product = reduce((lambda x,y : x*y), numbers)
這可以使用遞歸來完成:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.