将数组分成不均匀的组

4
在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在第二个数组中,以此类推。


4
你如何指定你希望 bc 的长度是多少?换句话说,你希望这种不均匀性具有什么特点? - Jim Pivarski
每个块最多为5。 - chuy08
3个回答

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]

0

如果我们对正在处理的数字有一些了解,我们可以更加高效地利用时间。我们也可以设计一个非常快速但内存效率低下的解决方案,但请考虑一下,如果符合您的需求:

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

0

现在我更好地理解了你对组的定义,我认为这个相对简单的答案不仅有效,而且速度也非常快:

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返回。由于它来自我们的监控系统,因此时间戳中可能存在间隙,例如机器故障导致该段时间内数据不可用。感谢您的帮助。 - chuy08
哦,那样的话请看我的修订答案。 - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接