【问题标题】:The average value of a list, in chunks of 100 items [duplicate]列表的平均值,以 100 项为单位 [重复]
【发布时间】:2025-11-28 16:05:02
【问题描述】:

我有一个文本文件,其中有例如 1084 个元素。我列出来了。

import csv
a = []
with open('example.txt', 'r') as csvfile:
    file_name = csv.reader(csvfile, delimiter='\t')
    for row in file_name:
        a.append(int(row[1]))
print(a)

[144, 67, 5, 23, 64...456, 78, 124]

接下来,我需要取列表中每 100 个元素的平均值,将最后 84 个元素取平均值并将其带到一个新列表中。 我该怎么做?也许用 numpy?

【问题讨论】:

  • 要将长度为 1084 的列表分块为大小为 100 的块,请使用此解决方案 How do you split a list into evenly sized chunks?。其余的都是微不足道的。你根本不需要 numpy/scipy。
  • @bunji:OP 不需要 numpy/scipy。请参阅我引用的用于分块列表的解决方案。
  • OP:如果解决方案必须使用 numpy(/pandas),请将其编辑到标题中,以明确为什么不应将其作为重复项关闭。如果不是,我们是否将其标记为欺骗,或者让它保持开放以反映两种(基础 Python + numpy)方法?

标签: python average chunks


【解决方案1】:

这将在 Python 3 中工作,我假设您正在使用它,因为您将 print 作为函数编写。在 Python 2 中,您需要确保除法是浮点除法。

# a = [...]

# Separate the groups. The last slice will be fine with less than 100 numbers.
groups = [a[x:x+100] for x in range(0, len(a), 100)]

# Simple math to calculate the means
means = [sum(group)/len(group) for group in groups]

如果您确实想在 Python 2 中执行此操作,可以将最后一行中的 len(group) 替换为 float(len(group)),以便强制浮点除法;或者,您可以添加模块的 from __future__ import division at the top,尽管这样做会改变整个模块,而不仅仅是这一行。


这是一个很好的、可重复使用的版本,它与迭代器一起工作,它本身就是一个生成器:

from itertools import islice

def means_of_slices(iterable, slice_size):
    iterator = iter(iterable)
    while True:
        slice = list(islice(iterator, slice_size))
        if slice:
            yield sum(slice)/len(slice)
        else:
            return

a = [1, 2, 3, 4, 5, 6]

means = list(means_of_slices(a, 2))

print(means)
# [1.5, 3.5, 5.5]

您不应该使代码比您实际需要的更通用,但为了获得额外经验值,您可以使代码更加通用和可组合。不过,上面的内容应该绰绰有余了。

【讨论】:

  • 添加未来的导入总是更好,而不是强制转换为浮动。未来的导入甚至适用于非常旧的版本,至少 2.4,如果不是更早的话。
  • 同意,如果您没有理由不这样做(例如遗留代码),那么导入会更好。有时您必须在回答中提到的内容中划清界限,否则您会说,“但实际上您应该只使用 Python 3,因为......”我很高兴您在这里提到它。谢谢。
【解决方案2】:

简单地说,切片并获得平均值。

import math
averages = []
CHUNK_SIZE = 100

for i in range(0, math.ceil(len(a) / CHUNK_SIZE)):
    start_index = i * CHUNK_SIZE
    end_index = start_index + CHUNK_SIZE
    chunk = a[start_index:end_index]
    averages.append(sum(chunk)/len(chunk))

【讨论】:

    【解决方案3】:

    您可以在基础 Python 中使用 senderle 的配方 How do you split a list into evenly sized chunks? 执行此操作:

    a = range(1,1084)
    
    from itertools import islice
    
    def chunk(it, size):
        it = iter(it)
        return iter(lambda: tuple(islice(it, size)), ())
    
    means = [sum(chk)/len(chk) for chk in chunk(a, size=100)]
    
    # [50.5, 150.5, 250.5, 350.5, 450.5, 550.5, 650.5, 750.5, 850.5, 950.5, 1042.0]
    

    【讨论】:

    • 为什么投反对票?这是工作 cpde,简单、清晰和基础的 Python。
    最近更新 更多