簡體   English   中英

根據值更改操作長度

[英]Change length of operation depending on a value

上下文

我正在嘗試創建一個程序,從左到右讀取所有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值的操作

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值

n = 2t = int(num[i]) * int(num[i+1])

n = 3t = int(num[i]) * int(num[i+1]) * int(num[i+2])

n = 4t = int(num[i]) * int(num[i+1]) * int(num[i+2]) * int(num[i+3])

n = 5t = int(num[i]) * int(num[i+1]) * int(num[i+2]) * int(num[i+3]) * int(num[i+4])

我怎樣才能創建一個可以適應任何n值的操作?

如果你想在不使用任何Python的操作迭代求解,你可以簡單地添加一個內部for ,從迭代ii+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM