Pythonic 的两个条件比例计算

1 投票
3 回答
3311 浏览
提问于 2025-04-16 10:21

这是一个关于Python编程风格的简单问题。

假设你有一个列表,如果你想计算满足条件(A和B)的项目占满足条件(A)的项目的比例,一个自然的解决办法是:

想象这个列表里是一些整数,条件A是(大于3),条件B是(大于5)。

count = 0
correct = 0

for item in items:
  if item > 3:
    count += 1

    if item > 5:
      correct += 1

score = float(correct) / count
print '%.2f' % score

还有一种替代的解决办法:

count = len([1 for i in items if i > 3])
correct = len([1 for i in items if i > 5])

score = float(correct) / count
print '%.2f' % score

虽然这种替代方案看起来更酷,但它需要遍历列表两次,所以效率不高。有没有一种被广泛接受的Python编程风格来处理这种常见情况,还是说第一个解决办法就足够好了呢?

谢谢。

3 个回答

0
from itertools import groupby
li={x:len(list(y))for x,y in groupby(l,lambda x:2 if x>5 else 1 if x>3 else 0)}
print(li[2]/(li[1]+li[2]))

python3.1

1

这不是一个通用的解决方案,而是根据你的问题和示例答案来提供的。

如果你知道这两个条件之间的关系,那么就不需要遍历这个序列两次:

gt3 = [x for x in items if x > 3]
count = len(gt3)
correct = sum(x > 5 for x in gt3)

一个更高效、更通用,同时也符合Python风格的解决方案可以是:

count, correct = map(sum, zip(*((x > 3, x > 5) for x in items)))

大于3和5的条件可以用其他任何条件来替代。

6

你的(替代)方案很好,只是有一个小改动:

count = sum(1 for i in items if i > 3)
correct = sum(1 for i in items if i > 5)

score = float(correct) / count
print '%.2f' % score

看起来像是列表推导式但没有括号的语法叫做生成器表达式

我不知道有什么简单的方法可以在不重复遍历列表两次的情况下找到解决方案,除了你已经提供的那个。我还是会选择上面的方案,除非有性能分析工具告诉我需要加快速度。

撰写回答