【问题标题】:Can anyone help me with finding the average of dictionary python 2.7?谁能帮我找到字典python 2.7的平均值?
【发布时间】:2015-06-22 06:37:16
【问题描述】:

我在遍历我的字典时遇到问题。程序应该打印字典中每个名字旁边的数字的平均值。谁能帮我弄清楚我做错了什么?以下是我当前的代码:

guest={"Mary":"15", "Joe":"13", "Dustin":"12"}

def CalcAverage(guest):
    total = 0.0
    numPersons = 0
    for key,value in guest.items():
        numPersons += len(guest[key])
        total = float(sum(guest[value]))
    return total/numPersons

print CalcAverage(guest)

【问题讨论】:

    标签: python function dictionary iteration


    【解决方案1】:

    你做错了什么:

    1. keyvalue 已经包含来自 字典。无需再次访问字典,如 guest[key]
    2. numPersons 应该在循环的每次迭代中增加 1, 而不是 len(guest[key]) 所做的值的长度。
    3. total 应该累加值的总和,而不是赋值 给每个人,即total += float(value)

    纠正这 3 项会产生如下代码:

    guest= {"Mary":"15", "Joe":"13", "Dustin":"12"}
    
    def CalcAverage(guest):
        total = 0.0
        numPersons = 0
        for key, value in guest.items():
            numPersons += 1
            total += float(value)
        return total / numPersons
    
    >>> CalcAverage(guest)
    13.333333333333334
    

    您可以通过使用生成器表达式将每个值转换为浮点数,将这些浮点数相加,然后除以来宾字典中的项目数来简化此操作:

    def CalcAverage(guest):
        return sum(float(v) for v in guest.values()) / len(guest)
    
    >>> CalcAverage(guest)
    13.333333333333334
    

    【讨论】:

    • 我必须使用迭代。那是迭代吗? (我不确定。抱歉)
    • 如果函数参数(guest)不使用与字典名称相同的名称,这个例子会更清楚一些。
    • 迭代发生在生成器表达式中。如果您必须使用 for 循环,请坚持下去,我会更新答案。
    • 谢谢你们,伙计们。我等着,mhawke。
    • 完美!谢谢你,mhawke!
    【解决方案2】:

    您一直在将数字定义为字符串,这使得它们不太容易处理。更好的是:

    guest={"Mary": 15, "Joe": 13, "Dustin": 12}
    

    或者已经是浮动的:

    guest={"Mary": 15.0, "Joe": 13.0, "Dustin": 12.0}
    

    您还使用了float(sum(guest[value]),它有两个主要问题:

    • guest[value] 尝试使用存储在 value 中的键从字典中获取值。但是value 不是密钥,那是行不通的。
    • 您只有字符串值,不能将它们与sum() 相加。

    代码中还有很多其他问题,举几个例子:

    • for key,value in guest.items(): 使密钥和它们的值在 for 块中可用 keyvalue。以后不需要索引guest。这意味着guest[key]value 相同。
    • len(guest[key]) 将返回 value 的长度,这是一个数字,并将返回 2(您的所有数字字符串都有两位数)。

    您想要归档的内容可以更轻松地完成:

    def calc_average(guest)
        length = len(guest)
        values = [float(value) for value in guest.values()]
        return sum(values) / length
    

    第一行获取字典的长度。第二行从列表中提取所有值并将它们转换为浮点数。这是一个列表理解。最后一行对这些值求和并返回平均值。顺便说一句:我还将函数的名称改编为通常的 Python 函数命名约定。

    【讨论】:

      【解决方案3】:

      Value 是一种 str 类型,您可以将其转换为 float 和简单的增量为总计

      def CalcAverage(guest):
      total = 0.0
      for key, value in guest.items():
          total += float(value)
      return total / len(guest)
      
      print CalcAverage(guest)
      

      你可以在 Python 3.0 的 functools 中使用 reduce。它更复杂。它接受一个迭代器来处理,但它本身不是一个迭代器。它返回一个结果

      def CalcAverage(guest):
          total = 0.0
          total = reduce(lambda x, y: float(x) + float(y), guest.values())
          return total / len(guest)
      
      print CalcAverage(guest)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-24
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 2021-05-31
        相关资源
        最近更新 更多