Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据值更改操作长度 上下文_Python - Fatal编程技术网

Python 根据值更改操作长度 上下文

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])

我试图创建一个程序,从左到右读取一个数字中所有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])

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