根据值更改操作时间

时间:2019-02-21 13:48:30

标签: python

上下文

我正在尝试创建一个程序,以从左到右的顺序读取数字中所有n对的乘积

例如,数字2345678:

  • 所有2对的乘积将为2 * 3 = 6、3 * 4 = 12、4 * 5 = 20、5 * 6 = 30等...
  • 这三对的乘积分别为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值的运算?

6 个答案:

答案 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]