计算一个数组中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] 

有谁知道是否有更好的办法解决这个问题?

+0

快速 “黑客” 来修复你的方法是'[总和(1我在l如果我> 0.6)]',但你需要为每个条件执行此操作,这将导致效率(在列表中多次遍历)。你最好使用简单明确的for循环。 – DeepSpace

+0

您可以对列表进行排序,还是您有更大的列表,这些列表可能无法排序? – TheDetective

+0

在我看来,“最短”的解决方案很少是最好的。我属于喜欢可读性的集团。 –

此代码正在为我工​​作,我适应了您的原创想法。

[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

我宁愿'总和(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})