查找列表中的数字簇

2023-12-31

我正在努力解决这个问题,因为我确信十几个 for 循环不能解决这个问题:

有一个数字排序列表,例如

numbers = [123, 124, 128, 160, 167, 213, 215, 230, 245, 255, 257, 400, 401, 402, 430]

我想创建一个包含数字列表的字典,其中数字(彼此跟随)的差值不超过 15。所以输出将是这样的:

clusters = {
    1 : [123, 124, 128],
    2 : [160, 167],
    3 : [213, 215, 230, 245, 255, 257],
    4 : [400, 401, 402],
    5 : [430]
}

我当前的解决方案有点难看(我必须在最后删除重复项......),我确信它可以以 pythonic 方式完成。

这就是我现在所做的:

clusters = {}  
dIndex = 0 
for i in range(len(numbers)-1) :
    if numbers[i+1] - numbers[i] <= 15 :
        if not clusters.has_key(dIndex) : clusters[dIndex] = []
        clusters[dIndex].append(numbers[i])
        clusters[dIndex].append(numbers[i+1])
    else : dIndex += 1

如果您的列表很小,则不是绝对必要的,但我可能会以“流处理”方式实现这一点:定义一个生成器,它接受您的输入可迭代,并生成分组为相差

def grouper(iterable):
    prev = None
    group = []
    for item in iterable:
        if prev is None or item - prev <= 15:
            group.append(item)
        else:
            yield group
            group = [item]
        prev = item
    if group:
        yield group

numbers = [123, 124, 128, 160, 167, 213, 215, 230, 245, 255, 257, 400, 401, 402, 430]
dict(enumerate(grouper(numbers), 1))

prints:

{1: [123, 124, 128],
 2: [160, 167],
 3: [213, 215, 230, 245, 255, 257],
 4: [400, 401, 402],
 5: [430]}

作为奖励,这甚至可以让您将运行分组为可能无限的列表(当然,只要它们已排序)。您还可以将索引生成部分粘贴到生成器本身中(而不是使用enumerate)作为一个小的增强。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找列表中的数字簇 的相关文章

随机推荐