【问题标题】:Python: Given List of Dictionaries return average of values based on key if key doesn't exist return nonePython:如果键不存在,则给定字典列表返回基于键的值的平均值
【发布时间】:2022-11-11 13:20:34
【问题描述】:

我正在研究一个将字典列表和所需年份作为输入的函数。该函数将检查是否存在所需的年份(键),如果存在,它将计算该键的 GPA 平均值。如果所需的年份不存在,它将不返回。我目前在处理确实存在的密钥时遇到了问题,但不确定如何返回不存在密钥的无/句柄实例。对于高级,它会正确计算所有高级的平均值,但不确定如何处理不存在初级的第二个函数调用。

Output for senior is correct: 2.19
However it should return none for junior.

【问题讨论】:

  • 这并不复杂。 if not year:/return None/else:/return avg。顺便说一句,avg 的计算应该没有缩进两个点,所以它在循环之外。在获得所有值之前,您不会计算平均值。当你这样做时,它应该在知道year 不为空的if 部分中。

标签: python list dictionary


【解决方案1】:

尝试这个:

def avgGpa(studentDic, desiredYear):
    res = [dct['GPA'] for dct in studentDic if dct['year'] == desiredYear]
    if res:
        return sum(res) / len(res)
    return None
      
print(avgGpa(student_data, 'senior'))
print(avgGpa(student_data, 'junior'))

输出:

2.19
None

【讨论】:

    【解决方案2】:

    avg计算移出循环(无需每次迭代计算)并检查year是否为空,如果为空则返回None:

    def avgGpa(studentDic, desiredYear):
        year = []
        for value in studentDic:
            if value['year'] == desiredYear:
                year.append(value)
        if len(year) == 0:
            return None
        avg = sum(value['GPA'] for value in year) / len(year)
        return avg
    

    【讨论】:

      【解决方案3】:

      另一种解决方案,使用statistics.mean

      from statistics import mean, StatisticsError
      
      student_data = [
          {"id": 0, "year": "freshman", "GPA": 0.03},
          {"id": 1, "year": "senior", "GPA": 0.7},
          {"id": 2, "year": "senior", "GPA": 2.77},
          {"id": 3, "year": "sophomore", "GPA": 1.1},
          {"id": 4, "year": "sophomore", "GPA": 1.05},
          {"id": 5, "year": "freshman", "GPA": 0.43},
          {"id": 6, "year": "senior", "GPA": 3.1},
      ]
      
      
      def avgGpa(studentDic, desiredYear):
          try:
              return mean(d["GPA"] for d in studentDic if d["year"] == desiredYear)
          except StatisticsError:
              pass
      
      
      print(avgGpa(student_data, "senior"))
      print(avgGpa(student_data, "junior"))
      

      印刷:

      2.19
      None
      

      【讨论】:

        猜你喜欢
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 2022-08-05
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多