如何将一个巨大的列表分成相等的块并将条件应用于这些块?

Posted

技术标签:

【中文标题】如何将一个巨大的列表分成相等的块并将条件应用于这些块?【英文标题】:how to divide a huge list in equal blocks and apply conditions to those blocks? 【发布时间】:2020-04-12 17:41:38 【问题描述】:

有两个部分

第 1 部分

我有一个包含数字的列表(+ve​​ 和 -ve)。

这些数字基本上是以15分钟时间区块为基础的,所以一天有96个区块,一年有35040个区块。

我有一年的数据,所以该列表中有 35040 个值。我想按天划分该列表(以 96 个块为单位)。我知道如何使用 yield 函数来划分列表,但我不知道如何访问这些列表并进行计算。所以第一部分是将这个列表分成 96 个块。

第 2 部分

假设如果我按区块计算违规次数,那么我希望我的计数器在第 97th 个区块重置,这意味着每天都会有一个新的计数器。

我的列表划分代码:

[lst[i:i + 96] for i in range(0, len(lst), 96)] 

我不知道如何在列表中的每 97th 块重置计数器。基本上,我想每天提取数据,96 个值代表 1 天,有 35040 个值,所以会有 365 天。所以请帮助每天提取数据并每天重置计数器。

预期输出:

time interval(15min) days     dev      counter
 1                             -1       
 2                             -2 
 3                             -54
 4                             -21
 5                             -42
 6                             -11
 7                             -32         1
 .                              .
 .                              . 
 .                              31         13 
 96                    1        32     (counter reset)
 97                             84          
 98                             32  
 99                             12
 100                            11
 101                             1
 102                             3 
 103                            23          1
 .                                   
 191                                        12
 192                   2        -43     (counter reset)
 ...
 35040                 365      -54 

我的计数器代码:

for each in dev:

    if each > 0:
        minus_counter = 0
        plus_counter += 1

        if plus_counter == 7:
            count = answer_counter
            row_counter = answer_counter
            counts.append(count)
            plus_counter = 0
            answer_counter += 1

        else:
            counts.append(0)

    elif each < 0:
        plus_counter = 0
        minus_counter += 1

        if minus_counter == 7:
            count = answer_counter
            row_counter = answer_counter
            counts.append(count)
            minus_counter = 0
            answer_counter += 1
        else:
            counts.append(0)

    row_counter += 1

这将计算 7 个连续的 -ve 或 +ve dev 的数量。 休息日重置部分我不知道该怎么做。

【问题讨论】:

呈现预期结果 用计数器和if条件试试 什么是violation 你的列表看起来怎么样? 我编辑了我的问题并添加了预期的结果和我的尝试 【参考方案1】:

对数据进行分区后,逐日评估 - 并枚举分区并从枚举中获取日期。

例子:

创建负数/正数并评估它们 数一下有多少是正数/负数/幅度超过 5
import random

data = [random.randint(-5,5)/.7 for _ in range(28)]

# partition into days with 4 datapoints per day
days = [ data[i:i+4] for i in range(0,28,4)]

# iterate over day data - no need to reset counters
# create tuples for each day, counting whatever we want)
# violations could be, f.e. magnitude > 5
count_em = [ (sum(v < 0 for v in d), sum(v >= 0 for v in d), 
              sum(abs(v) > 5 for v in d)) for d in days ]


# zip the data and the countings together, enumerate and output them
for day,(d,cnt) in enumerate(zip(days,count_em),1):
    print("day:",day, d)
    print("negative:   positive/zero:   magnitude > 5: \n".format(*cnt))

# total magnitudes > 5: 
# print ( sum( c[2] for c in count_em))

输出:

day: 1 [5.714285714285714, 5.714285714285714, -1.4285714285714286, -5.714285714285714]
negative: 2  positive/zero: 2  magnitude > 5: 3

day: 2 [0.0, 7.142857142857143, 2.857142857142857, -4.285714285714286]
negative: 1  positive/zero: 3  magnitude > 5: 1

day: 3 [7.142857142857143, -7.142857142857143, 5.714285714285714, 0.0]
negative: 1  positive/zero: 3  magnitude > 5: 3

day: 4 [-5.714285714285714, 5.714285714285714, 0.0, 2.857142857142857]
negative: 1  positive/zero: 3  magnitude > 5: 2

day: 5 [-4.285714285714286, -1.4285714285714286, -1.4285714285714286, 1.4285714285714286]
negative: 3  positive/zero: 1  magnitude > 5: 0

day: 6 [4.285714285714286, 0.0, -2.857142857142857, -1.4285714285714286]
negative: 2  positive/zero: 2  magnitude > 5: 0

day: 7 [1.4285714285714286, 4.285714285714286, -2.857142857142857, -4.285714285714286]
negative: 2  positive/zero: 2  magnitude > 5: 0

【讨论】:

以上是关于如何将一个巨大的列表分成相等的块并将条件应用于这些块?的主要内容,如果未能解决你的问题,请参考以下文章

将巨大的(95Mb)JSON 数组拆分成更小的块?

如何将数组列表分成相等的部分?

将列表分成相等的部分?

将列表拆分为长度大致相等的 N 部分

如何在php中将一个巨大的进程分成多个步骤?

将数字列表分成大致相等的总数