计算一个数组中2个值之间的数字量
我已经阅读了关于这个主题的几个问题,但我无法找到对我的具体问题的好答案。计算一个数组中2个值之间的数字量
我有列表:
l = [0.25, 0.875, 0.7, 0.175, 0.6, 0.55, 0.525]
我必须写一个返回整数作为结果的列表的方法,A分数即数,B分数的数量和C分数的数量,分别。 A分数是至少60%的分数,C分数是严格低于50%的分数。所有其他分数都是B分数。
所以,我们需要创建的列表是:
[3, 2, 2]
我已经试过与此代码的工作:
a = 0
b = 0
c = 0
for i in l:
if i>=0.6:
a+=1
elif i<0.5:
c+=1
else:
b+=1
return [a,b,c]
有谁知道是否有更好的办法解决这个问题?
此代码正在为我工作,我适应了您的原创想法。
[sum(1 for i in l if i >= 0.6) ,sum(1 for i in l if i < 0.6 and i>=0.5), sum(1 for i in l if i < 0.5)
它给你:
[3,2,2]
总和()计算其参数的总和,但我> 0.6返回一个布尔值
你真正想要的是获取通过测试
子数组的长度这是一种方式获得A-分数的数量
len([i for i in l if i >= 0.6])
我宁愿'总和(1,如果我> = 0.6,我在l中)''。这种方式不必创建一个不必要的列表。 –
你可以试试这个:
l = [0.25, 0.875, 0.7, 0.175, 0.6, 0.55, 0.525]
a_scores = [i for i in l if i >= 0.6]
b_scores = [i for i in l if i < 0.6 and i >= 0.5]
c_scores = [i for i in l if i < 0.5]
输出:
[0.875, 0.7, 0.6]
[0.55, 0.525]
[0.25, 0.175]
不是很简洁,但相当自我解释使用itertools.Counter
:
from collections import Counter
l = [0.25, 0.875, 0.7, 0.175, 0.6, 0.55, 0.525]
def abc(score):
if score < 0.5:
return 'C'
elif score < 0.6:
return 'B'
return 'A'
scores = Counter(abc(scr) for scr in l)
print(scores) # Counter({'A': 3, 'B': 2, 'C': 2})
lst = [scr for abc, scr in sorted(scores.items())]
print(lst) # [3, 2, 2]
这个计算所有成绩,而在你的列表迭代一次。
您可以在这里使用列表理解来首先将分数映射到分数。您可以创建一项功能,为每个年级分配一个分数,如下所示:
def assign_grade(x):
if x >= 0.6:
return 'A'
elif x < 0.50:
return 'C'
else:
return 'B'
其中x是将要输入的分数。然后,你可以调用该函数的每个项目在列表中:根据你的榜样
grades = [assign_grade(x) for x in scores]
以上的成绩将是牌号为每个分数的列表,[“C”,“A”,“A”, 'C', 'A', 'B', 'B']
以获得每个等级的计数可以使用计数功能:
grade_sums = [grades.count(x) for x in ['A', 'B', 'C']]
返回[3,2,2]
请勿过分复杂。编写简单,易懂,快速的代码比浮华代码好得多。
scores = [0.25, 0.875, 0.7, 0.175, 0.6, 0.55, 0.525]
a = b = c = 0
for score in scores:
if score >= 0.6:
a += 1
elif score < 0.5:
c += 1
else:
b += 1
tallies = [a, b, c]
上述代码比其他更复杂的代码执行得更快。
您还可以让列表开始有:
abc = [0, 0, 0]
...
abc[0] += 1
或字典:
abc = {'a': 0, 'b': 0, 'c': 0}
...
abc['a'] += 1
由其他SO-用户的启发,这个我想是要走的路:
from collections import Counter
l = [0.25, 0.875, 0.7, 0.175, 0.6, 0.55, 0.525]
def assign_grade(x):
if x >= 0.6:
return 'A'
elif x < 0.50:
return 'C'
else:
return 'B'
Counter([assign_grade(item) for item in l])
返回字典
Counter({'A': 3, 'B': 2, 'C': 2})
快速 “黑客” 来修复你的方法是'[总和(1我在l如果我> 0.6)]',但你需要为每个条件执行此操作,这将导致效率(在列表中多次遍历)。你最好使用简单明确的for循环。 – DeepSpace
您可以对列表进行排序,还是您有更大的列表,这些列表可能无法排序? – TheDetective
在我看来,“最短”的解决方案很少是最好的。我属于喜欢可读性的集团。 –