【问题标题】:Compute amount of numbers between 2 values in an array计算数组中两个值之间的数字数量
【发布时间】:2017-08-04 13:06:53
【问题描述】:

我已经阅读了几个关于这个主题的问题,但我找不到我的具体问题的好答案。

我有清单:

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]

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

【问题讨论】:

  • 修复您的方法的快速“hack”将是[sum(1 for i in l if i &gt; 0.6)],但您需要针对每个条件执行此操作,这将提高效率(多次遍历列表)。最好使用简单、明确的for 循环。
  • 您能否对列表进行排序,或者您是否有一个更大的列表,排序效率会很低?
  • 在我看来,“最短”的解决方案很少是最好的。我属于更喜欢可读性的组。

标签: python arrays python-3.x list


【解决方案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]

【讨论】:

    【解决方案2】:

    sum() 计算其参数的总和,但 i > 0.6 返回一个布尔值

    你真正想要的是获得通过测试的子数组的长度

    这是获得 A 分数数量的一种方法

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

    【讨论】:

    • 我更喜欢sum(1 for i in l if i &gt;= 0.6)。这样就不必创建不必要的列表。
    【解决方案3】:

    不是很简洁,但使用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]
    

    这会在遍历您的列表时计算所有成绩。

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      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]
      

      【讨论】:

        【解决方案5】:

        您可以在此处使用列表理解首先将分数映射到成绩。您可以创建一个函数来为每个等级分配分数,如下所示:

        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]

        【讨论】:

          【解决方案6】:

          受另一个 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})
          

          【讨论】:

            【解决方案7】:

            不要过于复杂。编写简单、易懂、快速的代码比写花哨的代码要好得多。

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-09-30
              • 2023-03-05
              相关资源
              最近更新 更多