【问题标题】:Sum values in nested lists python嵌套列表python中的总和值
【发布时间】:2017-06-01 08:52:15
【问题描述】:

我有一个清单:

l = [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]]

每个子列表中的第一项是名称,其他两个数字是标记(sub1 和 sub2)

嵌套列表可以是动态的,即嵌套列表的数量可以根据功能而变化。

我要找的是找

average of subj 1 i.e (10+34+40+30)/4 and 
similarly sub2 (30+89+60+20)/4

also average marks of a: (10+30)/2
average marks of b: (34+89)/2  and so on.

我试过了:

c = 0
for i in range(0,len(list_marks1)):
    c += list_marks1[i][1]
sub_1avg = float(c)/len(list_marks1)
d = 0
for i in range(0,len(list_marks1)):
    d += list_marks1[i][2]
sub_2avg = float(d)/len(list_marks1)

但这是不正确的。

有没有最佳的方法来做到这一点?因为我的嵌套列表中的主题数量也可以改变。

【问题讨论】:

  • 您应该考虑使用dictionary 代替可能更复杂的数据类型

标签: python list average


【解决方案1】:

您可以只使用 sum 和生成器表达式:

>>> l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]]
>>> length = float(len(l))  # in Python 3 you don't need the "float"
>>> sum(subl[1] for subl in l) / length 
28.5
>>> sum(subl[2] for subl in l) / length
49.75

或者甚至在列表推导中这样做:

>>> [sum(subl[subj] for subl in l) / length for subj in range(1, 3)]
[28.5, 49.75]

对于一个子列表的平均值也是如此:

>>> length = float(len(l[0])) - 1
>>> [sum(subl[1:]) / length for subl in l]
[20.0, 61.5, 50.0, 25.0]

当您拥有 python 3.4 或更高版本时,您可以将 sum / length 替换为 statistics.mean

>>> from statistics import mean
>>> [mean(subl[subj] for subl in l) for subj in range(1, 3)]  
[28.5, 49.75]

>>> [mean(subl[1:]) for subl in l]
[20, 61.5, 50, 25]

您询问了最好的方法,所以我可能应该提到有专门用于表格数据的包。例如,如果您有pandas,则使用DataFramemean 会更容易:

>>> import pandas as pd

>>> df = pd.DataFrame(l, columns=['name', 'x', 'y']) 
>>> df[['x', 'y']].mean(axis=0)
x    28.50
y    49.75
dtype: float64

>>> df[['x', 'y']].mean(axis=1)
0    20.0
1    61.5
2    50.0
3    25.0
dtype: float64

【讨论】:

    【解决方案2】:

    一种功能方法:

    l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]]
    map(lambda x: sum(x)/float(len(x)), zip(*l)[1:])
    [28.5, 49.75]
    

    这种方式适用于任何子列表长度

    【讨论】:

      【解决方案3】:
      l= [['a', 10, 30], ['b', 34, 89], ['c', 40, 60],['d',30,20]]
      sub1_avg =  sum(n for _,n, _ in l)/float(len(l))
      sub2_avg =  sum(n for _,_, n in l)/float(len(l))
      student_avgs = [{x[0]: sum(x[1:])//float((len(x)-1))} for x in l]
      print "Sub1 avg - {}\nSub2 avg - {}\nstudent avg - {}".format(sub1_avg, sub2_avg, student_avgs)
      

      样本输出

      Sub1 avg - 28.5
      Sub2 avg - 49.75
      student avg - [{'a': 20.0}, {'b': 61.0}, {'c': 50.0}, {'d': 25.0}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        相关资源
        最近更新 更多