使用map和lambda to list comprehension修改列表中的列表

时间:2018-03-19 01:48:19

标签: python python-3.x list list-comprehension

大家好我是Python的新手,并且一直在尝试如何在包含1到4的倍数的列表中创建列表,每个列表包含与它们乘以的数量相同的倍数。特别是,应用lambdamap函数。

 [[0],
  [0, 2],
  [0, 3, 6],
  [0, 4, 8, 12],
  [0, 5, 10, 15, 20]]

我尝试了几种方法,这是我目前正在处理的代码,但是我收到了NameError: name 'x' is not defined错误。如果有人能指出我忽略的错误,我将非常感激!

list_1 = [[0], [0,1], [0,1,2]]

result = list(map(lambda x, i ,j ,k: x[i][j] * k, list_1, range(3),items in x[i], range(1,3)))

print(result)

4 个答案:

答案 0 :(得分:0)

您获得了NameError,因为map的一个参数是items in x[i],此时没有定义任何内容。请记住,lambda等同于函数定义; xi是传入的参数的函数名称 - 它们不能用于定义其他参数,因为您在该范围之外执行此操作。 (对于items,它不会出现在代码中的任何其他位置,因此当然没有定义。)

从根本上说,这种逻辑都没有意义。特别是:由于您正在尝试生成嵌套数据结构,因此您应该期望嵌套map调用。

以较小的步骤执行此操作。首先尝试编写代码,例如[0, 4, 8, 12]4作为输入。然后你可以编写重复调用 的代码来制作你想要的列表。

答案 1 :(得分:0)

您当前的代码对于此问题来说过于复杂。相反,使用列表推导和单个嵌套map

new_result = [list(map(lambda x:i*x, range(i))) for i in range(1, 6)]

输出:

[[0], [0, 2], [0, 3, 6], [0, 4, 8, 12], [0, 5, 10, 15, 20]]

答案 2 :(得分:0)

我不知道在你的练习中使用map和lambda 是一个约束,但是你 顺便说一句,不需要它们

>>> [[i*j for j in range(i)] for i in range(1,6)]
[[0], [0, 2], [0, 3, 6], [0, 4, 8, 12], [0, 5, 10, 15, 20]]

答案 3 :(得分:0)

如果您想要纯粹的函数式编程,那么您可以试试这个:

print(list(map(lambda x:list(map(lambda z:z*x,list(range(x)))),range(1,6))))

输出:

[[0], [0, 2], [0, 3, 6], [0, 4, 8, 12], [0, 5, 10, 15, 20]]