2017-08-04 109 views
0

我已經閱讀了關於這個主題的幾個問題,但我無法找到對我的具體問題的好答案。計算一個數組中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

在我看來,「最短」的解決方案很少是最好的。我屬於喜歡可讀性的集團。 –

回答

1

此代碼正在爲我工​​作,我適應了您的原創想法。

[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] 
1

總和()計算其參數的總和,但我> 0.6返回一個布爾值

你真正想要的是獲取通過測試

子數組的長度這是一種方式獲得A-分數的數量

len([i for i in l if i >= 0.6]) 
+1

我寧願'總和(1,如果我> = 0.6,我在l中)''。這種方式不必創建一個不必要的列表。 –

0

你可以試試這個:

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] 
0

不是很簡潔,但相當自我解釋使用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] 

這個計算所有成績,而在你的列表迭代一次。

0

您可以在這裏使用列表理解來首先將分數映射到分數。您可以創建一項功能,爲每個年級分配一個分數,如下所示:

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]

0

請勿過分複雜。編寫簡單,易懂,快速的代碼比浮華代碼好得多。

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 
0

由其他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}) 
相關問題