列表列表中的平均列表 - 是否有更有效的方法?

时间:2013-07-22 17:34:57

标签: python performance python-3.x

我有一个名为'run'的列表列表。我正在使用代码的这一部分创建这些列表的平均值:

ave = [0 for t in range(s)]
for t in range(s):
    z = 0
    for i in range(l):
        z = z + run[i][t]
        #Converted values to a string for output purposes
        # Added \n to output
        ave[t]= ((str(z / l) + "\n"))

令我惊讶的是,这段代码是我第一次编写代码。我现在正计划使用更大的列表和更多的值,并且性能问题可能会发挥作用。这种写入方法在使用计算资源时是否平均效率低,我怎样才能编写更有效的代码呢?

4 个答案:

答案 0 :(得分:4)

列表理解可能更有效。

>>> run = [[1, 2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]]
>>> [sum(elem)/len(elem) for elem in zip(*run)]  
[5.666666666666667, 6.666666666666667, 7.666666666666667, 8.666666666666666]

或者,您可以尝试map()

>>> list(map(lambda x: sum(x)/len(x), zip(*run)))
[5.666666666666667, 6.666666666666667, 7.666666666666667, 8.666666666666666]

答案 1 :(得分:3)

通过让Python为您提供更多有效的内置函数和列表推导,您可以提高效率:

averages = [sum(items) / len(run) for items in zip(*run)]

答案 2 :(得分:1)

import numpy as np
ave = [np.avg(col) for col in zip(*run)]

OR

ave = [sum(col)/len(col) for col in zip(*run)]

答案 3 :(得分:0)

我输入这个问题是为了寻找以下内容,这很愚蠢,但由于它不使用 zip,因此不会忽略任何值。 如果你有一个不同长度的列表的数字列表,并想找到平均列表

import numpy as np

def my_mean(list_of_lists):
    maxlen = max([len(l) for l in list_of_lists])
    for i in range(len(list_of_lists)):
        while len(list_of_lists[i]) < maxlen:
            list_of_lists[i].append(np.nan)
    return np.nanmean(list_of_lists, axis=0)

aaa = [1, 2, 3]
bbb = [1, 2, 3, 5]
ccc = [4, 5, 6, 5, 10]
lofl = [aaa, bbb, ccc]
print(my_mean(lofl))

给予

[ 2.  3.  4.  5. 10.]