【问题标题】:Want to find a way of doing an average of multiple lists想找到一种平均处理多个列表的方法
【发布时间】:2013-04-16 01:01:44
【问题描述】:

假设我们在 python 中创建了一个这样的列表:

[[1, 2, 3], [1, 3, 4], [2, 4, 5]]

然后我想将1+1+2 除以 3,得到该元素的平均值并存储在一个新列表中。我想对第二个元素再次这样做,最后对第三个元素这样做。如何简洁地做到这一点? (我想不出除了多个循环之外的其他方法。)

输出应该是一个新列表[(1+1+2), (2+3+4), (3+4+5)]

非常感谢!

【问题讨论】:

标签: python list nested


【解决方案1】:

平均:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
>>> from __future__ import division
>>> [sum(e)/len(e) for e in zip(*data)]
 [1.3333333333333333, 3.0, 4.0]

总和:

>>> data = [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
>>> [sum(e) for e in zip(*data)]
 [4, 9, 12]

返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。

当参数已经在列表或元组中但需要为需要单独的位置参数的函数调用解包时...使用 *-operator 编写函数调用以将参数从列表或元组中解包出来。

>>> data
 [[1, 2, 3], [1, 3, 4], [2, 4, 5]]

>>> zip(*data)
 [(1, 1, 2), (2, 3, 4), (3, 4, 5)]

【讨论】:

    【解决方案2】:
    >>> l =  [[1, 2, 3], [1, 3, 4], [2, 4, 5]]
    >>> zip(*l)
    [(1, 1, 2), (2, 3, 4), (3, 4, 5)]
    >>> def average(nums, default=float('nan')):
    ...   return sum(nums) / float(len(nums)) if nums else default
    ... 
    >>> [average(n) for n in zip(*l)]
    [2.0, 2.6666666666666665, 3.6666666666666665]
    

    【讨论】:

    • 我认为您希望在最后一行出现zip(*l)。否则,您只是平均每个子列表(因此您得到 2、2-2/3 和 3-2/3,而不是 1-1/3、3 和 4)。
    猜你喜欢
    • 1970-01-01
    • 2021-04-08
    • 2021-10-16
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多