使lambda找到数对的乘积

2024-05-19 03:01:49 发布

您现在位置: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(numProduct)

问题:

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

我不知道如何修改lambda来只找到[2,9,8,9]中数字对(或各种其他长度)的乘积。我需要帮助。Tnx公司


Tags: tolambda代码infromimportnumberreduce
2条回答

Reduce()将把整个iterable减少为一个值-这不是您想要的。相反,考虑将相邻的值分组,并在每个组中取乘积

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]

更新

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

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

相关问题 更多 >

    热门问题