我有以下代码:
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
是列表。
我需要帮助来理解上面的代码。另外,我们如何以更简单的方式编写以上代码?
答案 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)