【问题标题】:Finding mean of a values in a dictionary without using .values() etc在不使用 .values() 等的情况下查找字典中值的平均值
【发布时间】:2020-10-07 00:51:22
【问题描述】:

我有一本看起来像这样的字典:

G={'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}

我必须找到值的平均值,例如mean(18,17,19,15,0) 使用简单的for 循环,而不使用.values().items() 等内置函数。我尝试了以下方法,但出现错误:

d=[float(sum(values)) / len(values) for key, values in G]
    return (d)   
ValueError: need more than 1 value to unpack

谁能帮我解决这个问题????

【问题讨论】:

  • 我没有看到其他答案符合你的问题的限制,我做了你想要的吗?
  • 根据您更新后的问题以及额外的限制,@AaronHall 似乎提供了正确的答案。

标签: python


【解决方案1】:

如果你使用 numpy:

import numpy as np

np.array(list(dict.values())).mean()

【讨论】:

  • 有趣的是,这违反了问题的约束——避免使用 dict 方法。
  • insanely_sin 下面的回答更简单:np.mean(list(dict.values()))
【解决方案2】:

要使用“简单的 for 循环”来执行此操作,请使用您的约束而不是使用 dict 方法:

G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}


count = 0
_sum = 0
for key in G:
    count += 1
    _sum += G[key]

print('this is the mean: ', _sum/count)

如果您应该避免使用 dict 方法,那么显然这是一项学术练习。

没有那个限制:

标准库中的statistics 模块有一个mean 方法,这是我首先想到的(因为标准库不需要第三方包。):

>>> G={'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
>>> from statistics import mean
>>> mean(G[k] for k in G)
13.8

像 numpy 和 pandas 这样的第三方包有带有 mean 方法的对象:

>>> from numpy import array
>>> array([G[k] for k in G]).mean()
13.8

>>> from pandas import Series
>>> Series([G[k] for k in G]).mean()
13.8

如果我们允许自己使用values() 方法,通过可迭代解包,这会变得更简单一些。出于某种原因,其他答案违反了该条件,所以我认为我应该展示更有效的方法:

>>> Series([*G.values()]).mean()
13.8

【讨论】:

    【解决方案3】:
    import numpy as np
    np.mean(list(dict.values()))
    

    【讨论】:

    • TypeError: 'list' 对象不可调用
    【解决方案4】:

    对字典的迭代迭代其键。尝试只使用for key in G,然后适当地使用G[key] 而不是values

    或者,使用字典的iteritems() 方法从G 中获取key, value 对,即:

    d=[float(sum(values)) / len(values) for key, values in G.iteritems()]
    

    (为了记录,你计算平均值的实际方法对我来说看起来不正确,但你最好先解决迭代问题)。

    【讨论】:

    • 是否可以在没有 .iteritems() 等内置函数的情况下使用它?
    • 当然,你使用我建议的第一种方法,你使用for key in G而不是for key, values in G,然后使用G[key]引用实际值。
    【解决方案5】:

    在 Python 3.4 以上有一个非常明确的方法:

    import statistics
    numbers = [G[key] for key in G]
    mean_ = statistics.mean(numbers)
    

    【讨论】:

      【解决方案6】:

      使用G.values() 从字典中获取所有值。

      G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
      d = float(sum(G.values())) / len(G)
      print (d)
      

      这打印出13.8

      请注意,这里的 Python 2 和 Python 3 是有区别的。在 Python 2 中,G.values() 是一个新构建的值列表。在 Python 3 中,它是一个生成器,可以被认为是一个“惰性列表”。同样的东西在 Python 2 中称为 G.itervalues()

      【讨论】:

      • +1:这既快速又简单。也很直观。太糟糕了.values 不是用户想要的。
      • 我们可以在不使用 .values() 的情况下做到这一点吗??
      • @Rachel:当然,看看其他答案。
      【解决方案7】:

      你想要:

      mean = sum([G[key] for key in G])/float(len(G))
      

      您的原始代码也会生成:

      TypeError: 'int' object is not iterable
      

      当您尝试对这些值求和时。

      【讨论】:

      • 您甚至不需要在这里使用keys 列表。您可以直接遍历G 的键,例如:sum([G[key] for key in G])/float(len(G))
      【解决方案8】:

      我建议采用可重用且灵活的函数式编程范式,而不是当前的答案。例如,创建一个函数来计算简单 dict 中包含的 list 值的任何统计数据:

      def summarize_dict(dictionary, function):
              dict_new = {}
          for k,v in dictionary.items():
              dict_new[k] = function(v)
          return dict_new
      

      测试:

      import numpy as np
      
      keys = ["a","b","c","d","e"]
      values = [range(2),range(4),range(6),range(8),range(10)]
      dictionary = dict(zip(keys, values))
      
      summarize_dict(dictionary, np.mean)
      

      产量:

      {'a': 0.5, 'b': 1.5, 'c': 2.5, 'd': 3.5, 'e': 4.5}
      

      【讨论】:

        【解决方案9】:

        另一个 for 循环,这个不需要项目计数器。

        G = {'E': 18.0, 'D': 17.0, 'C': 19.0, 'B': 15.0, 'A': 0}
        
        sum = 0
        for k in G:
            sum += float(G[k])
        
        print "Mean: " + str(sum/len(G))
        

        结果:

        Mean: 13.8
        [Finished in 0.3s]
        

        实际上,鉴于您的数据,没有必要使用float。就我而言,删除 float 并留下 sum += G[k] 仍然输出相同,因为这些值无论如何都不是字符串。

        【讨论】:

          【解决方案10】:

          假设您有一个包含多个键的字典,每个键都有一个值列表:

          your_averaged_dictionary = {key: np.mean(values) for key, values in your_dictionary}
          

          【讨论】:

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