使用map / lambda / sum / zip了解功能

时间:2018-07-06 16:39:17

标签: python python-3.x iterator

我有以下代码:

elem.classList.add('foo')

其中def solve(a, b): return map( lambda t: sum([x > y for x, y in zip(*t)]), ((a, b), (b, a)) ) a是列表。

我需要帮助来理解上面的代码。另外,我们如何以更简单的方式编写以上代码?

1 个答案:

答案 0 :(得分:0)

您的函数采用2个可迭代对象,并按索引计算一个可迭代对象的数量大于另一个可迭代对象的数量。然后,它以相反的顺序对列表执行相同的操作。

显示示例要容易得多

def solve(a, b):
    return map(lambda t: sum([x > y for x, y in zip(*t)]), ((a, b), (b, a)))

L1 = [1, 2, 3, 1]
L2 = [4, 5, 1, 5]

res = list(solve(L1, L2))  # [1, 3]

与布尔值之和

res[0] = 1,因为1 <4,2 <5, 3> 1 ,1 <5。

res[1] = 3是因为 4> 1 5> 2 ,1 <3, 5> 1

请注意,具有可迭代的布尔值的sum会将True视为1,将False视为0。这是很自然的,因为bool被实现为int的子类。上面的粗体值被视为True,因此,此类实例的计数将是这些值上sum的结果。

列表理解

列表理解更容易理解:

res = [sum(i > j for i, j in zip(*L)) for L in ((L1, L2), (L2, L1))]

生成器表达式

实际上,由于map返回了一个惰性迭代器,因此solve更类似于生成器表达式,该表达式的性能应优于map变体:

res = (sum(i > j for i, j in zip(*L)) for L in ((L1, L2), (L2, L1)))

然后可以迭代生成器表达式:

for item in res:
    print(item)

或通过诸如list之类的功能耗尽发电机:

res_list = list(res)