【问题标题】:call lambda functions from list从列表中调用 lambda 函数
【发布时间】:2019-10-29 04:34:25
【问题描述】:

如果我有一个包含 lambda 函数的列表,例如:

a = [lambda x: x * 2]

如何将这个 lambda 函数调用到列表中:

b = [1,2,3,4]

这样它的结果可能是:

result = list(map(lambda x: x * 2,  b))

然后得到:

[2,4,6,8]

进一步,如果 a 包含两个 lambda 函数,例如:

a = [lambda x:x * 2, lambda x: x-1]

如何在不使用 for 循环或列表推导但使用 map() 的情况下调用这些函数来列出 b?

希望有人能帮帮我!

【问题讨论】:

标签: python list lambda


【解决方案1】:

你可以这样做

result = list(map(a[0],  b))
# [2,4,6,8]

因为 lambda 函数是 a 的第一个元素

第二个函数也是一样的

result = list(map(a[1],  b))

如果你想在一行中应用所有功能

[list(map(a[i],b)) for i in range(len(a))]
#[[2, 4, 6, 8], [0, 1, 2, 3]]

【讨论】:

  • 如果我不想使用列表推导但使用嵌套映射函数怎么办?
  • 您想要与列表理解相同的输出吗?如果是这样,我认为你做不到
【解决方案2】:

无论列表中存储了多少元素,您都可以迭代列表中的 lambda 函数:

a = [lambda x:x * 2, lambda x: x-1]
b = [1, 2, 3, 4]
for func in a:
     # apply each function on b and turn the results to list:
     print(list(map(func, b)))

如果要存储每个结果:

a = [lambda x:x * 2, lambda x: x-1]
b = [1, 2, 3, 4]
results = []

for func in a:
    results.append(list(map(func, b)))

【讨论】:

  • 如果我不想使用for循环而是使用嵌套的map函数怎么办?
【解决方案3】:

在将单个 lambda 封装在列表中的特殊情况下,这样做

result = list(map(a[0], b))

但是python中没有特殊情况。所以对于一般情况,你可以有一个平面列表:

result = [f(x) for f in a for x in b]

或嵌套的:

result = [[f(x) for f in a] for x in b]

您可以通过交换ab 上的循环来反转列表的排序顺序。

您甚至可以使用itertools.product 来获得扁平外壳(同样可以使用ab 互换以更改结果的顺序):

result = [f(x) for f, x in itertools.product(a, b)]

【讨论】:

  • 如果我不想使用列表推导但使用嵌套映射函数怎么办?
  • @YiyangChen。从所有意图和目的来看,列表理解是一种更快(在我看来更干净)的方式来处理list(map...),结合filter。你可以使用任何你喜欢的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2022-12-05
相关资源
最近更新 更多