这是关于pythonic编码的一个非常简单的问题。
给定一个列表,如果你想计算满足(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
替代方案对我来说看起来更性感,虽然它会循环两次并且效率不高。是否有一个公认的pythonic解决方案,或者第一个解决方案是否足够好?
感谢。
答案 0 :(得分: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
看起来像没有括号的列表推导的语法称为generator expression。
我不知道有任何可读的方法来获得解决方案而不会在列表上迭代两次,而不是你已经拥有的那个。我仍然会使用上面的解决方案,除非分析器告诉我必须加快速度。
答案 1 :(得分:1)
这不是一般解决方案,而是基于您的问题和示例答案的解决方案。
如果你知道这两个条件之间的关系,那么你不必两次遍历序列:
gt3 = [x for x in items if x > 3]
count = len(gt3)
correct = sum(x > 5 for x in gt3)
一种有效的,更通用的,仍然是pythonic的解决方案可能是:
count, correct = map(sum, zip(*((x > 3, x > 5) for x in items)))
大于3和5的条件可以被任何其他条件替换。
答案 2 :(得分: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