列表的平均值,以100个项目为块

时间:2018-11-19 11:10:51

标签: python average chunks

我有一个文本文件,其中有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?

3 个答案:

答案 0 :(得分:1)

这将在Python 3中起作用,因为您将print编写为函数,所以我假设您正在使用Python 3。在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]

您不应使代码的通用性超出实际需求,但为了获得额外的经验值,您可以使代码更加通用和可组合。上面的内容足以供您使用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

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]