【问题标题】:Average List from a List of Lists - Is there a more efficient way?列表列表中的平均列表 - 有没有更有效的方法?
【发布时间】:2013-07-22 17:34:57
【问题描述】:

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

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"))

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

【问题讨论】:

标签: python performance python-3.x


【解决方案1】:

列表推导可能更有效。

>>> 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]

【讨论】:

  • 哎呀!固定的。谢谢。 :)
【解决方案2】:

您可以通过高效的内置函数和列表推导让 Python 为您完成更多工作,从而提高效率:

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

【讨论】:

    【解决方案3】:
    import numpy as np
    ave = [np.avg(col) for col in zip(*run)]
    

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

    【讨论】:

    • 我在文档中没有看到itertools.zip,这引入了numpy 依赖。
    • 感谢@user2357112 的错误报告。它是固定的。 numpy 依赖项是利用 numpy 提供的效率,至少与没有它的平均速度一样快
    • 我仍然在这里看到itertools.zip。那应该是什么? (当您使用它时,这是一种使用 numpy 的奇怪方式。您为什么不使用 numpy.average(run, 0)?)
    • 我想你想要itertools.izip,而不是itertools.zip。或者只使用zip
    • 我很确定 itertools.izip 在 Python 3 中只是 zip。请查看 itertoolszip 的文档。另外,我认为numpy.avg 甚至不存在。
    【解决方案4】:

    我输入这个问题是为了寻找以下内容,这很愚蠢,但由于它不使用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.]
    

    【讨论】:

    • 由于列表长度的巨大差异,您扩展列表的部分似乎效率极低。
    • 我同意!欢迎任何增强。这对我的个人用例来说已经足够了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2010-09-25
    • 1970-01-01
    • 2017-02-03
    • 2021-08-16
    • 2020-04-23
    • 2014-02-22
    相关资源
    最近更新 更多