在Python分组/数字集群(Grouping / clustering numbers in Py

2019-07-19 16:17发布

我GOOGLE了,我测试过了,这有我在我束手无策。 我有我需要按相似号码列表。 例如,在列表[1,6,9,100,102,105,109,134,139],1 6 9将被放入一个列表中,100,102,105,和109将被置于列表,以及134和139.我在数学可怕的,我已经试了又试,但我无法得到它的工作。 要明确越好,我想组数字是在10倍的值是彼此远离。 任何人都可以帮忙吗? 谢谢。

Answer 1:

有很多方法可以做到聚类分析 。 一个简单的方法是看连续的数据元素之间的间隙尺寸:

def cluster(data, maxgap):
    '''Arrange data into groups where successive elements
       differ by no more than *maxgap*

        >>> cluster([1, 6, 9, 100, 102, 105, 109, 134, 139], maxgap=10)
        [[1, 6, 9], [100, 102, 105, 109], [134, 139]]

        >>> cluster([1, 6, 9, 99, 100, 102, 105, 134, 139, 141], maxgap=10)
        [[1, 6, 9], [99, 100, 102, 105], [134, 139, 141]]

    '''
    data.sort()
    groups = [[data[0]]]
    for x in data[1:]:
        if abs(x - groups[-1][-1]) <= maxgap:
            groups[-1].append(x)
        else:
            groups.append([x])
    return groups

if __name__ == '__main__':
    import doctest
    print(doctest.testmod())


Answer 2:

这将找到的组:

nums = [1, 6, 9, 100, 102, 105, 109, 134, 139]
for k, g in itertools.groupby(nums, key=lambda n: n//10):
    print k, list(g)

0 [1, 6, 9]
10 [100, 102, 105, 109]
13 [134, 139]

请注意,如果NUMS实际上不是归类为您的样本显示,你就必须先解决它。



Answer 3:

首先,你可以轻松地将任何序列成对相邻项的序列。 只是三通它,向前移动它,拉链和未移位和未移位副本。 唯一的问题是,你需要开始与任一(<something>, 1)(139, <something>)因为在这种情况下,我们要的不是每对元素的,但对每个元素:

def pairify(it):
    it0, it1 = itertools.tee(it, 2)
    first = next(it0)
    return zip(itertools.chain([first, first], it0), it1)

(这是不写它最简单的方式,但我认为这可能是最可读的人谁不熟悉的方式itertools 。)

>>> a = [1, 6, 9, 100, 102, 105, 109, 134, 139]
>>> list(pairify(a))
[(1, 1), (1, 6), (6, 9), (9, 100), (100, 102), (102, 105), (105, 109), (109, 134), (134, 139)]

然后,斯内德尔德的主要的稍微复杂些的版本,你可以只使用groupby

不过,我认为在这种情况下,这将最终会被比的明确发生器,做同样的事情更加复杂。

def cluster(sequence, maxgap):
    batch = []
    for prev, val in pairify(sequence):
        if val - prev >= maxgap:
            yield batch
            batch = []
        else:
            batch.append(val)
    if batch:
        yield batch


文章来源: Grouping / clustering numbers in Python