【问题标题】:Average of elements in a list in the second column第二列列表中元素的平均值
【发布时间】:2018-02-01 19:47:52
【问题描述】:

我有一个文件名和文件大小的二维列表,我试图找到第二列中所有元素的平均值,但搜索了大约 2 小时后找不到任何帮助。

这是我的清单:

input: print fileArr

output: [[['david.ppt'], [56437456]], [['terry.dmg'], [54485656]], [['mike.doc'], [6593543]], [['randy.docx'], [5968434]], [['rick.exe'], [4538565]], [['chris.txt'], [2569437]], [['sarah.txt'], [458667]], [['fred.png'], [54966]], [['terry.dat'], [4596]], [['flyer.jpg'], [4305]]]

我尝试了多种可能的解决方案,但均无济于事。

【问题讨论】:

  • 为什么将值包装在一个附加列表中?
  • 据我了解,它位于二维列表中。如果您指的是三个开头的括号(“[[[”),这就是我从 IDE 复制它的方式。

标签: python python-2.7 list average


【解决方案1】:

这可能会做到:

fileArr = [[['david.ppt'], [56437456]], [['terry.dmg'], [54485656]], [['mike.doc'], [6593543]], [['randy.docx'], [5968434]], [['rick.exe'], [4538565]], [['chris.txt'], [2569437]], [['sarah.txt'], [458667]], [['fred.png'], [54966]], [['terry.dat'], [4596]], [['flyer.jpg'], [4305]]]

average = sum(second[0] for first, second in fileArr) // len(fileArr)
print(average)

正如 Willem 评论的那样,关键的观察结果是,您的每个项目都包装在一个额外的、无关的列表中。所以第一对并不是人们所期望的:

['david.ppt', 56437456],

但取而代之的是一对单元素列表:

[['david.ppt'], [56437456]],

【讨论】:

    【解决方案2】:

    你可以试试这个:

    s = [[['david.ppt'], [56437456]], [['terry.dmg'], [54485656]], [['mike.doc'], [6593543]], [['randy.docx'], [5968434]], [['rick.exe'], [4538565]], [['chris.txt'], [2569437]], [['sarah.txt'], [458667]], [['fred.png'], [54966]], [['terry.dat'], [4596]], [['flyer.jpg'], [4305]]]
    vals = [i[-1][0] for i in s]
    print(sum(vals)/float(len(vals)))
    

    【讨论】:

    • @EdselNorwood 很高兴为您提供帮助!
    【解决方案3】:

    首先,从每个内部列表中获取所有第二个元素:

    all_sizes = [x for _, x in fileArr] # we use _ as a variable name for the first element of each inner list.
                                        # _ as a name usually indicates it won't be used
    

    现在,你所要做的就是找到平均值

    print sum(all_sizes) / float(len(all_sizes))
    

    【讨论】:

      【解决方案4】:

      首先,将值(作为字符串,这已经很奇怪)包装在另一个列表中是相当奇怪的。

      声明式方法是使用numpy:

      from numpy import array
      
      array(fileArr)[:, 1, 0].astype(int).mean()
      

      对于您的示例数据,这将给出:

      >>> array(fileArr)[:, 1, 0].astype(int).mean()
      13111562.5
      

      Numpy 是一种构造多维数组的方法。通过使用array(..),我们将数据加载到一个 numpy 数组中。然后我们使用切片[:,1,0] 我们为每一行获得第二个项目,然后为该列表获得第一个元素。接下来我们使用astype(int) 将项目转换为整数,然后我们调用.mean() 来计算该整数数组的平均值。

      【讨论】:

      • 这只是我复制它的方式。
      • numpy 总是有用的,但在那种情况下是不是有点矫枉过正?
      • @KyrSt: numpy 有几个优点:它对大量数据更有效,而且它是声明性的(代码解释自己),而且它还考虑了角情况(如NaNs )。
      • 是的,是的,就是这些,还有更多。我唯一担心的是,它可能会让经验不足的程序员感到困惑(我想更有可能找到这个问题)。我并不是说这不是一个正确/有帮助的答案,我只是想指出以前的事实,以帮助那些过来的人避免混淆。
      猜你喜欢
      • 1970-01-01
      • 2021-09-30
      • 2020-07-12
      • 1970-01-01
      • 2011-11-30
      • 1970-01-01
      • 2013-07-22
      • 2019-11-25
      • 2018-02-01
      相关资源
      最近更新 更多