python 嵌套列表上的 lambda 映射

python lambda map over nested list

我最近在 Hackerrank 中收到了以下我无法回答的问题,而且我在其他任何地方都找不到正确的答案。

完成lambda映射函数: 给定一个数组,例如 [[1,2,3,-1,2],[2,4,-3]] 取两个数组中所有非负数的平方。输出应该是:

[1,4,9,4]

[4,16]

此外,数组还会在数组的开头包含一个额外的数字,即数组的长度。因此在上面的示例中,长度为 2,因此将通过函数传递的最终数组将为 [2, [1,2,3,-1,2],[2,4,-3]]。 (我们不想取初始数的平方,在本例中为 2)

def lambdamap(arr):

    final = map(

 #write your lambda function here

 , arr)
    
return final

在创建所需输出的映射中创建一个 lambda 函数。

我尝试了很多不同的方法,例如

map(lambda x: x**2, filter(lambda x: x>0, arr)) 

但这不适用于嵌套列表,例如通过函数传递的数组。 如果我可以提供任何信息来帮助澄清问题,请告诉我。

def lambdamap(arr):
    return map(
        lambda x: map(
            lambda y: y**2,
            filter(lambda z: z > 0, x)
        ),
        map(
            lambda b: b[1],
            filter(lambda a: a[0] > 0, enumerate(lst))
        )
    )

为了更好的可读性,我们还可以这样做:

def lambdamap(arr):
    _arr = map(
        lambda b: b[1],
        filter(lambda a: a[0] > 0, enumerate(lst))
    )

    return map(
        lambda x: map(lambda y: y**2, filter(lambda z: z > 0, x)),
        _arr
    )

结果

lst = [2, [1, 2, 3, -1, 2], [2, 4, -3]]


outcome = [list(x) for x in list(lambdamap(lst))]
print(outcome)

很明显,这里的list comprehension只是看打印出来的结果是一个list。如果结果实际上需要是一个列表,我们可以将前两个 map() 函数包装在 lambdamap()

内的 list() 函数中

您必须在 lambda 函数中使用 lambda 函数。结果不是那么漂亮,但它有效:

list(map(lambda x: list(map(lambda y: y ** 2, filter(lambda z: z > 0, x))), arr[1:]))

对于给定的输入案例,输出:

[[1, 4, 9, 4], [4, 16]]

如果您不能使用列表切片,您可以使用 filter(lambda x: isinstance(x, list), arr) 而不是 arr[1:]


让我们从最里面的 lambda 函数开始,然后向外展开。为了简化事情,我们首先考虑如何在单个列表上执行此操作,称为 x:

  • filter(lambda z: z > 0, x) 给出了 x.
  • 中的所有正元素
  • 然后我们使用 map 对所有这些元素进行平方:map(lambda y: y ** 2, ...)
  • 这给了我们 map(lambda y: y ** 2, filter(lambda z: z > 0, x)).

这为我们提供了适用于单个列表的东西。我们如何扩展它以使用列表列表?好吧,每个列表的操作都以相同的方式定义,所以再次使用map! (切掉第一个元素,因为它不是列表,并将地图对象转换为列表以匹配所需的输出)。

这最终给了我们:

list(map(lambda x: list(map(lambda y: y ** 2, filter(lambda z: z > 0, x))), arr[1:]))

如最初指定的那样。

虽然我不确定这一点,但听起来输入的长度可能包含在开头,需要原封不动地传递。如果是这样的话,这里有一个 lambda 函数,它将接受输入并产生所需的输出:

lambda i: [n**2 for n in i if n > 0] if isinstance(i, list) else i

这部分对 non-negatives 求平方:[n**2 for n in i if n > 0]

但仅当值为列表时:if isinstance(i, list)

否则传值通过:else i

也就是说这个输入[2, [1, 2, 3, -1, 2], [2, 4, -3]]returns这个输出[2, [1, 4, 9, 4], [4, 16]]