【问题标题】:How to create list [10x2] from list [100x2]如何从列表 [100x2] 创建列表 [10x2]
【发布时间】:2019-09-25 20:00:02
【问题描述】:

我将基于一个非常相似的问题: How to create list from 100 elements to list of 10

在我的情况下,列表如下所示:

例如

a = [[[100], ['Wed Sep 25 13:01:51 2019']], 
[[200], ['Wed Sep 25 13:01:51 2019']],
[[300], ['Wed Sep 25 13:01:52 2019']],
[[400], ['Wed Sep 25 13:01:52 2019']], 
[[500], ['Wed Sep 25 13:01:53 2019']], 
[[600], ['Wed Sep 25 13:01:53 2019']], 
[[700], ['Wed Sep 25 13:01:54 2019']]
[[800], ['Wed Sep 25 13:01:54 2019']]]

如您所见,每个样本每半秒采集一​​次。我对此类列表的适当“均衡”有疑问。我想制作另一个列表,该列表将是具有时间戳的值的平均值,该时间戳来自该样本的第一行或最后一行。

我试图从堆栈上的附加链接编辑此类转换器,因此执行此代码的结果:

A = [[[100], ['Wed Sep 25 13:01:51 2019']],
[[200], ['Wed Sep 25 13:01:51 2019']],
[[300], ['Wed Sep 25 13:01:52 2019']],
[[400], ['Wed Sep 25 13:01:52 2019']],
[[500], ['Wed Sep 25 13:01:53 2019']],
[[600], ['Wed Sep 25 13:01:53 2019']],
[[700], ['Wed Sep 25 13:01:54 2019']],
[[800], ['Wed Sep 25 13:01:54 2019']]]

B = [sum(A[i:i+2][0][0])/2 for i in range(0, len(A), 2)]
print(B)

会给出期望的结果,例如:

b = [[[150], ['Wed Sep 25 13:01:51 2019']], 
    [[350], ['Wed Sep 25 13:01:52 2019']],
    [[550], ['Wed Sep 25 13:01:53 2019']],
    [[750], ['Wed Sep 25 13:01:54 2019']]], 

虽然它给出了结果:

[50.0, 150.0, 250.0, 350.0]

首先是错误的,其次是没有时间戳。 我应该修改什么?

【问题讨论】:

    标签: python list iteration


    【解决方案1】:

    这是使用itertools.groupby 的一种方法,它具有在任意数量的采样率下工作的优点:

    from itertools import groupby
    from statistics import mean
    
    b = []
    f = lambda i: i[1][0].rsplit(maxsplit=2)[-2]
    for k,v in groupby(a, key=f):
        z = list(zip(*list(v)))
        mean_ = mean(i[0] for i in z[0])
        b.append([[mean_], z[1][1]])
    

    print(b)
    
    [[[150], ['Wed Sep 25 13:01:51 2019']],
     [[350], ['Wed Sep 25 13:01:52 2019']],
     [[550], ['Wed Sep 25 13:01:53 2019']],
     [[750], ['Wed Sep 25 13:01:54 2019']]]
    

    虽然推荐的处理时间序列数据的方式是使用pandas而不是列表:

    from itertools import chain
    import pandas as pd
    
    l = list([[*chain.from_iterable(i)] for i in a])
    pd.DataFrame(l).groupby(1)[0].mean()
    
    1
    Wed Sep 25 13:01:51 2019    150
    Wed Sep 25 13:01:52 2019    350
    Wed Sep 25 13:01:53 2019    550
    Wed Sep 25 13:01:54 2019    750
    Name: 0, dtype: int64
    

    【讨论】:

    • 完美!非常感谢。我应该修改哪些值才能在具有 ex 的列表上工作。 5 个样本?
    • 没什么,应该按原样工作:) @kaszankabanka
    【解决方案2】:

    按照您的方法,需要进行一些更改:

    • 您的sum 当前对一个对象求和:第一个数字。所以我们想把它改成对每一行的数量求和:sum(a[0][0] for a in A[i:i+2])

    • 您只创建了那些没有匹配时间戳的计算列表。总而言之:

    A = [[[100], ['Wed Sep 25 13:01:51 2019']],
    [[200], ['Wed Sep 25 13:01:51 2019']],
    [[300], ['Wed Sep 25 13:01:52 2019']],
    [[400], ['Wed Sep 25 13:01:52 2019']],
    [[500], ['Wed Sep 25 13:01:53 2019']],
    [[600], ['Wed Sep 25 13:01:53 2019']],
    [[700], ['Wed Sep 25 13:01:54 2019']],
    [[800], ['Wed Sep 25 13:01:54 2019']]]
    
    B = [[[sum(a[0][0] for a in A[i:i+2])/2], A[i][1]] for i in range(0, len(A), 2)]
    print(B)
    

    给予:

    [[[150.0], ['Wed Sep 25 13:01:51 2019']], 
     [[350.0], ['Wed Sep 25 13:01:52 2019']], 
     [[550.0], ['Wed Sep 25 13:01:53 2019']], 
     [[750.0], ['Wed Sep 25 13:01:54 2019']]]
    

    【讨论】:

    • 谢谢,我相信这是最简单的方法,不需要额外的包:)
    【解决方案3】:

    试试下面的代码:

    b = [[sum([A[i][0][0],A[i+1][0][0]])/2,A[i][1]] for i in range(0,len(A),2)]
    print(b)
    
    Output:
    [[150.0, ['Wed Sep 25 13:01:51 2019']], [350.0, ['Wed Sep 25 13:01:52 2019']], [550.0, ['Wed Sep 25 13:01:53 2019']], [750.0, ['Wed Sep 25 13:01:54 2019']]]
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 2015-01-17
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      相关资源
      最近更新 更多