二维列表的平均值

时间:2011-02-22 01:38:24

标签: python

基本上,该函数应该提供列表中列表的平均值。 例如:

lst = [[46, 27, 68], [26, 65, 80], [98, 56, 35], [98, 65, 0]]
average(lst)
>>> [47.0, 57.0, 63.0, 54.33333333333333]

我的代码:

def average(l):
    for i in range(len(l)):
        for j in range(len(l[0])):
            l[i] / l[j]
    return l

我的编码显示错误标志,上面写着“TypeError:/ support'和'list'”不支持的操作数类型。我不知道我做错了什么。

6 个答案:

答案 0 :(得分:5)

首先 - 缩进非常重要:

Then thou must space to four. Four shall be the number of the
spacing and the number of the spacing shall be four. Five shalt
thou not space, neither shalt thou space three, excepting that
thou then proceedeth to four. Tab characters are right out.

第二 - 使用有用的变量名。一个字符通常没用。

def average(lst):
    for lstNum in range(len(lst)):
        for sublistItem in range(len(lst[lstNum])):
            lst[lstNum] / lst[sublistItem] # <-- ??
    return lst

现在应该很清楚(呃)现在用作lst索引的sublistItem是没有意义的。如果我们用lst [lstNum] [sublistItem]替换lst [sublistItem]会更好,但是你会将列表除以整数,这也没有意义。

第三 - 模式

for num in range(len(lst)):
    val = lst[num]

是非Pythonic;如果你真的需要,请使用

for num,val in enumerate(lst):

相反,甚至更好,

for val in lst:

第四,要获得平均值,您需要将列表的总和除以其中的数字;在您的代码中,您既没有这样做。分别尝试sum(lst)和len(lst)。

答案 1 :(得分:3)

考虑您引用的对象类型l[i]。最初的一个是l[0] - 即[95, 92, 86]。换句话说,一个清单。

如果你知道它总是只有两个深,你需要像

这样的东西
for each sublist in l
    for each item in sublist
        sum = sum + item
    avg = sum / len(sublist)
    append avg to returnlist

这是在伪代码中仔细完成的,因为自己想出这些东西会更有趣。

如果知道嵌套列表的深度,您将需要考虑递归,例如

proc: 
    for each sublist in list
        if sublist has sublists
            call proc with each sublist
        else
            call avg on sublist

答案 2 :(得分:1)

有一件事是错误的是

l[i] / l[j]

你不会将结果分配给任何东西或以任何方式显示它。您的程序执行操作但不保存在任何位置。因此,当您在函数结束时返回l时,您将获得与发送完全相同的内容。

旁注 这是你可能想看的东西。它并不完全符合您的要求,但您应该能够根据需要进行更改。来自教程http://docs.python.org/tutorial/stdlib.html#quality-control

def average(values):
    """Computes the arithmetic mean of a list of numbers.

    >>> print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)

答案 3 :(得分:0)

让我们先缩进你的代码:

def average(l):
 for i in range(len(l)):  # Line 1
    for j in range(len(l[0])):  # Line 2
        l[i] / l[j] # Line 3
 return l
  1. l是一个列表,如[[46,27,68],[26,65,80]]
  2. 在第1行,我将成为您列出的外部列表项目[46,27,68]
  3. 在第2行,j只是第一个列表的元素。
  4. 在第4行,您使用另一个列表索引列表并引发错误!
  5. 很少注意到。

    您不必使用len和range进行迭代。只是元素的迭代器

    for element in mylist:
       pass
    

    使用sum之类的内置来计算总和(顺便说一下,你没有这样做,平均值会要求它)。 逻辑是首先计算内部元素的平均值,然后移动到外部列表(如果你想要的话)。

答案 4 :(得分:0)

单行代码可以完成这项工作!

list(map(lambda x:sum(x)/len(x), lst))

答案 5 :(得分:0)

您试图将list除以一个数字(l[i]是一个列表。例如 [46, 27, 68])。

我会像在纸上一样写它:一次一个值。我会查看第一个列表,将它们相加并除以列表中的数字。然后上升并重复下一个清单。

def average(numbers):
    averages = []
    for group in numbers:
        group_sum = 0
        for value in group:
            group_sum += value
        averages.append(group_sum / len(group))
    return averages

如果您已经学习了一些使用的功能,那么请使用它们。 (例如sum(group)而不是手动执行此操作。)您的老师并不像他们认为您已经学会了他们正在教授的内容那样寻找答案。

所以问题是他们教你什么? (这是一个修辞问题。)