【问题标题】:calculate the average of each sublist separately inside a list of lists在列表列表中分别计算每个子列表的平均值
【发布时间】:2020-05-14 00:15:20
【问题描述】:

我对 Python 非常陌生,我正在尝试查找列表列表的平均值。 我有一个浮点数列表,表示每学期的课程成绩,如下所示:

 mylist =  [[[2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]], [[2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0], [2.67, 2.67, 2.0, 2.0]]]

我想要做的是找到每个子列表的平均值并将其再次作为子列表放置,以便更轻松地访问它。例如,我想要以下内容:

myaverage= [[[2.335],[2.335],[2.335],...]]]

在我向您展示的列表的这一部分出现的数字并不是故意的。我试着这样做:

for s in mylist:  # for each list
        gpa = sum(s) / len(s)
        allGPA.append(gpa)
        for x in s:  # for each sublist
            x_ = x if type(x) is list else [x]
            myaverage.append(sum(x_) / float(len(x_)))

但我收到此错误:

gpa = sum(s) / len(s) 类型错误:+ 的不支持的操作数类型:'int' 和 'list'

我无法理解我的方法是否完全错误,或者我是否在列表中循环错误。

【问题讨论】:

  • 挑剔:使用if type(x) is list,而不是if isinstance(x, list)
  • mylist 是一个列表列表,所以你需要一个额外的循环。或者,将所有内容替换为 np.array(mylist).mean(axis=-1)
  • 您有 2 个级别的子列表。你可能期待print ([[sum(i)/len(i) for i in l] for l in mylist])
  • @Marat 这给了我一个来自 _mean 中的 _method.py 的错误:ret = ret / rcount,然后又是:TypeError: unsupported operand type(s) for /: 'list' and 'int'
  • @piggy 我已经更新了我的答案,它符合您的期望。请看一看。

标签: python list average


【解决方案1】:

试试这个:

from statistics import mean

avg = [[ mean(sub_list) for sub_list in list ] for list in mylist]

如果语法看起来有点混乱,请查看list comprehensions

【讨论】:

    【解决方案2】:

    我认为将您的数据保存在某种集合中是谨慎的做法,让我们使用字典并创建一个可读的函数来解析您的数据。

    功能

    from collections import defaultdict
    
    def return_averages(gpa_lists):
        """ Takes in a list of lists and returns a dictionary of averages.
         the key will be the level of each sublist."""
        gpa_dict = {number_of_list : outer_list for number_of_list, outer_list in enumerate(gpa_lists)}
    
        gpa_averages = defaultdict(list)
        
        for list_number,lists in gpa_dict.items():
            for each_list in lists:
                gpa_averages[list_number].append(sum(each_list) / len(each_list))
            
        return gpa_averages
       
    

    用法。

    return_averages(mylist)
    
    
    defaultdict(list,
                {0: [2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335],
                 1: [2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335,
                  2.335]})
    

    【讨论】:

      【解决方案3】:

      看看这个我已经更新了我的答案,输出是你想要的。

      allGPA = []
      myaverage = mylist
      c = 0
      count = 0
      gpa = [0]
      for list in mylist:
          for i in range(len(list)):
              gpa[0] = sum(mylist[c][i]) / len(mylist[c][i])
              allGPA.append(gpa)
              myaverage[c][i] = gpa
              print(myaverage[c][i])
      
          c = c + 1
      print(myaverage)
      

      【讨论】:

      • 感谢您的回复!结果,这给了我一个列表,而不是我需要的带有子列表的列表。
      • 没问题@piggy
      猜你喜欢
      • 2020-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2023-02-04
      相关资源
      最近更新 更多