-2

使用 zip 和列表推导,创建一个新列表 L3,如果 L1 中的数字大于 10 并且 L2 中的数字小于 5,则将两个数字相加。这可以在一行代码中完成。

我已经尝试了下面的代码。谁能解释为什么 python 抱怨?

L1 = [1, 5, 2, 16, 32, 3, 54, 8, 100]
L2 = [1, 3, 10, 2, 42, 2, 3, 4, 3]
L3 = map(lambda  (x1,x2): x1 + x2  if(x1 > 10 and x2 < 5)  , zip(L1,L2))
L4 = map(lambda  x: x[0] + x[1]  if(x[0] > 10 and x[1] < 5)  , zip(L1,L2))
print(L3)
print(L4)
4

2 回答 2

2

这是一个XY 问题。当它要求列表理解时,您正在使用地图。它本质上是要求过滤器,而不是地图。

>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]

你可以用一种实用的风格来做,但它太丑了。不要这样做。

L3 = list(map(
    lambda t: t[0]+t[1],
    filter(
        lambda t: t[0]>10 and t[1]<5,
        zip(L1, L2)
        )
    ))
print(L3)  # -> [18, 57, 103]
于 2020-11-21T20:42:07.583 回答
0

看看这里: lambda 函数必须有一个返回值,如果您的 if 语句不正确,则没有。因此,您必须添加一个 else 语句,例如:

L4 = map(lambda  x: x[0] + x[1]  if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))

结果是

[0, 0, 0, 18, 0, 0, 57, 0, 103]

您的第一次尝试(L3)不起作用,因为 lambda 无法再在 python 3.x 中解包元组(请参阅:here

另请注意, map() 返回一个对象,为了打印其内容,您必须调用

print(list(map_object))
# in your case:
print(list(L4))
# or set()

根据评论进行编辑:如果您真的想要一个单行,并且您的第一句话说“使用 zip 和列表理解”并且您想省略 0,那么这可能会起作用并且比 map 和 lambda 更容易:

L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]

如果您真的、真的、真的坚持使用 map 和 lambda,请编辑 2:

L4 = map(lambda  x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
于 2020-11-21T20:05:28.867 回答