迭代Python中的列表列表

时间:2011-02-21 02:30:23

标签: python list

我的学习指南中有这个问题,它需要一个获取二维列表平均值的函数,并将它们打印为一个列表。 我真的没有经验弄乱二维列表,因此不知道哪里开始攻击这个问题。

它应该做什么的例子:

avrg([[85, 23, 45], [66, 75, 54], [85, 54, 70], [34, 10, 0]])

[51.0, 65.0, 162.333333333334, 14.66666666666667]

我的编码:

def avrg(L):
    for i in range(len(L)):
        for j in range(len(L[0])):
            L[i][j] / i

    return L

我的编码在哪里出错了?

4 个答案:

答案 0 :(得分:1)

第1,第2和第4个数字是第1,第2和第4个列表的平均值,但第3个不是。我会认为这是一个错字,你的意思是'69 .666 ......'。

你在'L [i] [j] / i'位置出错了。您可以将该语句视为计算值,然后将其删除;你没有把它分配给任何东西。您可能也希望返回一个新列表,而不是将值放入参数中。此外,您在循环和索引中出错,而不是实际计算平均值。另外,你在j循环中出错了:如果某个列表的值多于另一个列表怎么办?另外,你通过不使用pythonic并使用范围和索引在列表上循环而不是循环遍历项目本身('对于L中的子列表:'')来“错误”。另外,你没有使用列表推导就错了。

这就是我要做的事情:

def avrg(L):
   return [sum(sublist) / len(sublist) for sublist in L]

print(avrg([[85, 23, 45], [66, 75, 54], [85, 54, 70], [34, 10, 0]])

答案 1 :(得分:1)

首先,表达式x / y会产生一个值,但不会更改xy。如果您正在使用Python,您可能还想考虑在迭代中使用实际列表内容而不是更像C的“范围”和访问器。希望这会给你一个强有力的推动正确的方向:

def avrg( inlist ):
    result = []
    for a in inlist:
        # now "a" is just a list by itself
        n = len(a)
        total = sum(a)
        # you can fill in the rest here
    return result

答案 2 :(得分:0)

没有总结。 您必须在每行中添加元素,然后除以长度(在本例中为3)。

答案 3 :(得分:0)

import numpy as np
def avrg(ls):
    return map(np.average, ls)