【问题标题】:Python 2.7.9: list of dictionaries, calculating mean and stdPython 2.7.9:字典列表,计算平均值和标准差
【发布时间】:2015-07-20 15:31:24
【问题描述】:

使用 Python 2.7.9:我有一个包含“数据”项的字典列表,如何将每个项访问到列表中,以便获得平均值和标准差?这是一个例子:

values = [{'colour': 'b.-', 'data': 12.3}, {'colour': 'b.-', 'data': 11.2}, {'colour': 'b.-', 'data': 9.21}]

到目前为止我有:

val = []
for each in values:
    val.append(each.items()[1][1])
print np.mean(val) # gives 10.903
print np.std(val)  # gives 1.278

粗鲁而且不是很 Pythonic(?)

【问题讨论】:

    标签: python list dictionary std mean


    【解决方案1】:

    使用列表推导可能是最简单的。您可以像这样提取数字:

    numbers = [x['data'] for x in values]
    

    然后你只需调用 numpys mean/std/etc 函数,就像你正在做的那样。

    【讨论】:

      【解决方案2】:

      为(也许)一个不必要的问题道歉,我看到了这个:

      average list of dictionaries in python

      vals = [i['data'] for i in values]
      np.mean(vals) # gives 10.903 
      np.std(vals)  # gives 1.278
      

      (Pythonic 解决方案?)

      【讨论】:

      • Joel Hinz,谢谢,是的,我看到了同样的解决方案
      【解决方案3】:

      索引到字典中是一个非常糟糕的主意,因为它不能保证顺序。有时“数据”元素可能是第一个,有时它可能是第二个。不检查就无法知道。

      使用字典时,您几乎应该总是使用键来访问元素。在字典符号中,这是{ key:value, ... },其中每个键都是“唯一的”。我不记得 python 字典键的“唯一”的确切定义,但它认为它是您的对象或文字的 (type, hash) 对。

      记住这一点,我们有更多的pythonic:

      val = []
      for data_dict in values:
        val.append(data_dict['data'])
      

      如果你想变得花哨,你可以使用列表完成,这是一种从更复杂的语句生成列表的奇特方式。

      val = [data_dict['data'] for data_dict in values]
      

      为了更花哨,您可以添加一些条件来检查错误。

      val = [data_dict['data'] for data_dict in values if (data_dict and 'data' in data_dict)]
      

      这种最奇特的做法是用if (data_dict and 'data' in data_dict) 过滤for data_dict in values 迭代的结果,以便您在data_dict['data'] 中使用的唯一data_dict 实例是通过if- 的实例检查。

      【讨论】:

        【解决方案4】:

        你想要一个pythonic one Liner?

        data = [k['data'] for k in values]
        print("Mean:\t"+ str(np.mean(data)) + "\nstd :\t" + str(np.std(data)))
        

        你可以使用一个班轮

        print("Mean:\t"+ str(np.mean([k['data'] for k in values])) + "\nstd :\t" + str(np.std([k['data'] for k in values])))
        

        但真的没有意义,因为两者都打印

        Mean:   10.9033333333
        std :   1.27881021092
        

        而且前者更具可读性。

        【讨论】:

          猜你喜欢
          • 2014-03-21
          • 2016-04-17
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 2018-06-17
          • 1970-01-01
          相关资源
          最近更新 更多