如何使用列表推导式统计高低配对的数量?
如何用列表推导式实现两个列表对应元素的计数统计?
你的代码报错核心原因是:列表推导式内部只能放置表达式,而at+=1是赋值语句,不属于表达式范畴,因此Python会判定为语法错误。
最优解决方案:用生成器表达式配合sum
没必要用列表推导式(会生成无用列表浪费内存),直接用生成器表达式结合sum函数就能简洁实现统计,这也是更Pythonic的写法:
a = [47, 67, 22] b = [26, 47, 12] # 统计a中元素大于b对应元素的次数 at = sum(1 for x, y in zip(a, b) if x > y) # 统计a中元素小于b对应元素的次数 bt = sum(1 for x, y in zip(a, b) if x < y) print(at, bt) # 输出:2 1
原理:生成器表达式遍历zip(a,b)的每一组元素,当满足条件时生成1,sum函数将这些1累加,直接得到计数结果。
若非要用列表推导式(不推荐)
如果坚持要用列表推导式,可借助Python 3.8+支持的海象运算符:=(它能将赋值操作转为表达式),但会生成无意义的列表,可读性也较差:
a = [47, 67, 22] b = [26, 47, 12] at, bt = 0, 0 # 用下划线接收无用的列表 _ = [at := at+1 if x>y else bt := bt+1 if x<y else None for x, y in zip(a, b)] print(at, bt) # 输出:2 1
原代码的冗余优化点
你原来的循环里[c for c in zip(a, b)]是多余的,zip(a,b)本身就是可迭代对象,直接遍历即可:
for x, y in zip(a, b): if x > y: at +=1 elif x < y: bt +=1
内容的提问来源于stack exchange,提问作者Johnny John Boy
相关产品推荐
相关产品推荐

