【问题标题】:split arrays into uneven groups将数组拆分为不均匀的组
【发布时间】:2013-05-27 22:18:51
【问题描述】:

在 python 中给定一个数组,如下所示:

a = [ 0, 1, 3, 4, 6, 7, 8, 10, 14 ]

我想把它分成三个不均匀的组,这样我最终会得到这样的结果:

b = [0, 1, 3, 4]
c = [6, 7, 8]
d = [10, 14]

我想按 5 的倍数对数字进行分组。因此,从 0 到 4 的任何整数都将在第一个数组中结束,5 - 9 在第二个数组中,依此类推。

【问题讨论】:

  • 如何指定您希望bc 存在多长时间?换句话说,您希望不均匀具有哪些属性?
  • 最多 5 个块,是的。

标签: python list split


【解决方案1】:

如果我们对正在处理的数字有所了解,我们可以或多或少地节省时间。我们也可以想出一个非常快速的内存效率非常低的内存,但是如果它符合您的目的,请考虑一下:

#something to store our new lists in
range = 5 #you said bounds of 5, right?
s = [ [] ]
for number in a:
    foundit = false
    for list in s:
        #deal with first number
        if len( list ) == 0:
            list.append( number )
        else:
            #if our number is within the same range as the other number, add it
            if list[0] / range == number / range:
                foundit = true
                list.append( number )
    if foundit == false:
       s.append( [ number ] )

【讨论】:

    【解决方案2】:

    现在我更好地理解了你对组的定义,我认为这个相对简单的答案不仅会起作用,而且应该很快:

    from collections import defaultdict
    
    a = [0, 1, 3, 4, 6, 7, 8, 10, 14]
    chunk_size = 5
    buckets = defaultdict(list)
    
    for n in a:
        buckets[n/chunk_size].append(n)
    
    for bucket,values in sorted(buckets.iteritems()):
        print '{}: {}'.format(bucket, values)
    

    输出:

    0: [0, 1, 3, 4]
    1: [6, 7, 8]
    2: [10, 14]
    

    【讨论】:

    • 为了进一步解释我的例子,让我解释一下最终结果是什么。目前我正在查询我们的监控系统以获取时间序列数据,以便制作报告。例如,如果我查询 1 小时的数据,我想将其分成 5 分钟的块,所有时间都在 epoc 中返回。因为它来自我们的监控系统,时间戳中可能存在间隙,例如一台机器发生故障,因此该时间段内的数据不可用。感谢您的帮助。
    • 哦,在这种情况下,请参阅我修改后的答案。
    【解决方案3】:

    Itertools.groupby 永远是答案!

    这里我们将每个数字向下舍入到最接近的 5,然后按相等的数字分组:

    >>> for n, g in itertools.groupby(a, lambda x: round(x/5)*5):
        print list(g)
    
    [0, 1, 3, 4]
    [6, 7, 8]
    [10, 14]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 2019-03-20
      • 2019-10-05
      相关资源
      最近更新 更多