【问题标题】:Python - Average every "n" elements in a listPython - 平均列表中的每个“n”元素
【发布时间】:2017-01-30 10:07:12
【问题描述】:

我需要平均 Python 列表中的每个 n 元素,在此示例中为 n = 3

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]

所以输出列表将是:

list2 = [2, 2, 2, 5, 5, 5, 8, 8, 8]

【问题讨论】:

  • 您自己尝试过吗?
  • 显示编码尝试,所以n 在您的示例中是 3?
  • 结果不应该是[2,5,8]吗?
  • 你能再解释一下这个问题吗?关于什么是n,以及o / p应该如何出现。目前,您只有输入和输出,没有任何 n 定义。如果我们假设 n 为 3,那么它对 o/p 有点意义,但您可能想要完全不同的东西。并告诉我们你到目前为止尝试了什么。结果不应该是 [2,5,8] 而不是返回冗余数据吗?
  • @wvdz 我需要在list2 中保持相同数量的元素,所以我也想将平均值写入块中的前 2 个元素

标签: python list average


【解决方案1】:

您可以像这样在列表推导中计算[2,5,8] 列表:

list1 = [1,2,3,4,5,6,7,8,9]
n = 3

list2 = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]

然后按照您的要求将其放回list1(保留大小):

for i in range(len(list1)):
    list1[i] = list2[i//n]

或使用列表理解:

list1 = [list2[i//n] for i in range(len(list1))]

最终编辑:找到了一个不错的单行线来总结:

import itertools
list1 = list(itertools.chain.from_iterable([i]*n for i in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]))

【讨论】:

  • 体面的答案,但在国际海事组织看来,当 OP 自己没有做出任何努力时,提供一个似乎过于慷慨。也不清楚楼层划分在这里最合适
【解决方案2】:

@Jean-François Fabre's answer借一点,但使用statistics.mean (avaiable for python 3.4+)

>>> from statistics import mean
>>> from itertools import chain

>>> lst = [1,2,3,4,5,6,7,8,9]
>>> n = 3

>>> list(chain.from_iterable([mean(lst[i:i+n])]*n for i in range(0,len(lst),n)))
[2, 2, 2, 5, 5, 5, 8, 8, 8]

【讨论】:

    【解决方案3】:

    你可以在 numpy 中使用 mean 为:

    import numpy as np
    list1 = [1,2,3,4,5,6,7,8,9]
    np.mean(np.array(list1).reshape(-1, 3), axis=1)
    

    【讨论】:

      【解决方案4】:
      >>> n = 3
      >>> list1 = [1,2,3,4,5,6,7,8,9]
      >>> [avg for avg in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)] for j in range(n)]
      [2, 2, 2, 5, 5, 5, 8, 8, 8]
      

      不需要 itertools :-)

      解释:以下将作业分为 2 个步骤;这有帮助吗?哪一部分还不清楚?

      >>> n = 3
      >>> list1 = [1,2,3,4,5,6,7,8,9]
      >>> averages = [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]
      >>> print("averages: ", averages)
      averages:  [2, 5, 8]
      >>> list2 = [avg for avg in averages for j in range(n)]
      >>> print("list2: ", list2)
      list2:  [2, 2, 2, 5, 5, 5, 8, 8, 8]
      

      更新:另一种不使用 itertools 的方法:

      >>> list2 = sum(([a]*n for a in [sum(list1[i:i+n])//n for i in range(0,len(list1),n)]), [])
      [2, 2, 2, 5, 5, 5, 8, 8, 8]
      

      解释:我们像以前一样计算平均值。然后我们像这样散布它们:

      >>> averages = [2, 5, 8]
      >>> list2 = sum(([a]*n for a in averages), []) ### see note [1] below
      >>> list2
      [2, 2, 2, 5, 5, 5, 8, 8, 8]
      

      可以像这样进一步展开:

      >>> all_items = list([a]*n for a in averages)
      >>> all_items
      [[2, 2, 2], [5, 5, 5], [8, 8, 8]]
      >>> sum(all_items, [])
      [2, 2, 2, 5, 5, 5, 8, 8, 8]
      >>>
      

      注意 [1]:sum 的第一个参数乍一看似乎包含在不必要的圆括号中...如果您认为是这样,请尝试在没有它们的情况下运行它,看看会发生什么。

      【讨论】:

        【解决方案5】:

        如果有人正在寻找一个全 numpy 的解决方案,只要数组的长度可以被 n 整除,这两行就可以工作:

        avg = np.mean(array1.reshape(-1, n), axis=1)
        array2 = np.repeat(avg, n)
        

        如果数组的长度不能被 n 整除,则可以平均剩余元素。执行此操作的函数可能看起来像这样:

        import numpy as np
        def average(arr, n):
            remainder = len(arr) % n
            if remainder == 0:
                avg = np.mean(arr.reshape(-1, n), axis=1)
                avg = np.repeat(avg, n)
                return avg
            else:
                avg_head = np.mean(arr[:-remainder].reshape(-1, n), axis=1)
                avg_tail = np.mean(arr[-remainder:])
                avg_head = np.repeat(avg_head, n)
                avg_tail = np.repeat(avg_tail, remainder)
                return np.append(avg_head, avg_tail)
        

        n=3、n=4 和 n=5 的示例:

        >>> array1 = np.arange(1, 10)
        >>> array1
        array([1, 2, 3, 4, 5, 6, 7, 8, 9])
        
        >>> average(array1, 3)
        array([2., 2., 2., 5., 5., 5., 8., 8., 8.])
        
        >>> average(array1, 4)
        array([2.5 2.5 2.5 2.5 6.5 6.5 6.5 6.5 9. ])
        
        >>> average(array1, 5)
        array([3.  3.  3.  3.  3.  7.5 7.5 7.5 7.5])
        

        【讨论】:

          猜你喜欢
          • 2014-04-14
          • 2017-06-11
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          • 2013-07-22
          • 1970-01-01
          相关资源
          最近更新 更多