我正在处理Leetcode问题1013。我找到了解决方案,只有一行,但我不能理解代码背后的概念。
import itertools
A = [0,2,1,-6,6,-7,9,1,2,0,1]
def canThreePartsEqualSum(A):
return (lambda x,y: x in y and 2*x in y and 3*x in y)(sum(A)//3,itertools.accumulate(A))
print(canThreePartsEqualSum(A))
我希望你们中的一些人能为我详细描述一下,谢谢〉〈
2条答案
按热度按时间bwitn5fc1#
代码首先导入itertools模块,该模块提供了许多处理迭代器的函数。
然后,定义函数canThreePartsEqualSum(A),该函数将列表A作为输入,并返回指示该列表是否可以被划分为三个部分以使得每个部分的和相等的布尔值。
在函数内部,定义并返回一个lambda函数,这个lambda函数有两个参数:lambda函数检查以下条件是否为真:
最后,使用列表A作为参数调用canThreePartsEqualSum(A)函数,并打印结果。
例如,如果列表A为[0,2,1,-6,6,-7,9,1,2,0,1],A中元素的总和为10,则sum(A)//3为3。itertools.accumulate(A)函数将返回一个迭代器,该迭代器生成以下序列:[0,2,3,-3,3,-4,5,6,8,8,9]。lambda函数将检查3,6和9是否是该序列的元素,如果是,则lambda函数将返回True,canThreePartsEqualSum(A)函数将返回True。print()函数的输出将为True。
juud5qan2#
我会尽量把每一部分都分解开来
总和(A)= 9
总和(A)//3= 9//3 = 3(这是楼层划分)
itertools.accumulate(A)-返回传递的可迭代对象的累计总数。在本例中,它将是[0,2,3,-3,3,-4,5,6,8,8,9]
(sum(A)//3,itertools. accumulate(A))-这是一个元组。它实际上是(3,[0,2,3,-3,3,-4,5,6,8,8,9]),但是如果你试图打印它,它只会给予你(3,〈itertools.accumulate对象〉)
(lambda x,y: x in y and 2*x in y and 3*x in y)
-这是一个lambda函数,初学者可能会很困惑,它基本上是一个匿名函数,在本例中,它检查x
(元组(sum(A)//3,itertools.accumulate(A))
中的第一个元素,在本例中是3)是否在accumulate对象中,以及2*3
和3*3
是否也在该列表中。如果满足所有条件,则返回True,否则返回False。