Python 让lambda查找数字对的乘积

Python 让lambda查找数字对的乘积,python,Python,代码: from functools import reduce num = 2989 numSplit = [int(x) for x in str(num)] # convert the number to a list with each digit separated numProduct = reduce((lambda x,y: x*y), numSplit) # uses reduce to multiply each number in order print(numPr

代码

from functools import reduce

num = 2989

numSplit = [int(x) for x in str(num)]
# convert the number to a list with each digit separated

numProduct = reduce((lambda x,y: x*y), numSplit)
# uses reduce to multiply each number in order

print(numProduct)
问题

使用NumProduct,我试图找到
2*9
9*8
8*9
的独立产品

我不知道如何修改lambda,以便只在
[2,9,8,9]
中查找数字对(或各种其他长度)的乘积。我需要这方面的帮助。Tnx

Reduce()
会将整个iterable减少为一个值-这不是您想要的。相反,考虑将相邻值分组成组,并在每个组内取乘积。< /P>
num = 2989

numSplit = [int(x) for x in str(num)]
numProduct = [x * y for x, y in zip(numSplit, numSplit[1:])]
在这里,我将
zip
列表
numSplit
numSplit
片段偏移1,以将每个数字与其右邻居分组。然后将这两个值相乘,对其进行迭代。如果一个列表比另一个短,
zip
会将所有列表截短到最短的长度-这就是此处发生的情况,防止在末尾出现额外的术语

结果:

>>> numProduct
[18, 72, 72]
>>> numProduct
[144, 648]
更新

如果您想支持任意大小的分组,请使用以下方法:

from functools import reduce
from operator import mul

num = 2989
size = 3

numSplit = [int(x) for x in str(num)]
numProduct = [reduce(mul, p) for p in zip(*(numSplit[x:] for x in range(size)))]
结果:

>>> numProduct
[18, 72, 72]
>>> numProduct
[144, 648]
Reduce()
将整个iterable减少为一个值-这不是您想要的。相反,考虑将相邻值分组成组,并在每个组内取乘积。< /P>
num = 2989

numSplit = [int(x) for x in str(num)]
numProduct = [x * y for x, y in zip(numSplit, numSplit[1:])]
在这里,我将
zip
列表
numSplit
numSplit
片段偏移1,以将每个数字与其右邻居分组。然后将这两个值相乘,对其进行迭代。如果一个列表比另一个短,
zip
会将所有列表截短到最短的长度-这就是此处发生的情况,防止在末尾出现额外的术语

结果:

>>> numProduct
[18, 72, 72]
>>> numProduct
[144, 648]
更新

如果您想支持任意大小的分组,请使用以下方法:

from functools import reduce
from operator import mul

num = 2989
size = 3

numSplit = [int(x) for x in str(num)]
numProduct = [reduce(mul, p) for p in zip(*(numSplit[x:] for x in range(size)))]
结果:

>>> numProduct
[18, 72, 72]
>>> numProduct
[144, 648]

如果你真的想,你可以在这里使用reduce

from operator import mul
from functools import partial, reduce

p = partial(reduce, mul)

list(map(p, zip(numSplit, numSplit[1:])))

[18, 72, 72]

[reduce(mul, y) for y in zip(numSplit, numSplit[1:])]

[18, 72, 72]

如果你真的想,你可以在这里使用reduce

from operator import mul
from functools import partial, reduce

p = partial(reduce, mul)

list(map(p, zip(numSplit, numSplit[1:])))

[18, 72, 72]

[reduce(mul, y) for y in zip(numSplit, numSplit[1:])]

[18, 72, 72]

使用
itertools.compositions(numSplit,2)
。使用
itertools.compositions(numSplit,2)
。有办法增加分组的长度吗?就像按298和989分组一样。@user8507808更新以处理任意大小的分组有没有办法增加分组的长度?如按298和989对其进行分组。@user8507808已更新以处理任意大小的分组