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]]
我最近在 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]]