给定一个数字列表,找到一个可以覆盖最多数字的固定范围

Given a list of numbers, find a fix range that can cover the most numbers

在python中,我们可以使用计数器来查找列表中最常见的元素。 有没有什么办法可以传入函数,让落在一定范围内的元素反算。

假设我有 [123, 127, 99,75,86, 83,81],我想 return 类似 {'12X':2, '8X':3, '99 ':1, '75':1}

有什么想法吗?

根据上下文,您尝试执行的操作可能是:

合并

这是将您的元素分组到大小相等或预定义的离散箱/桶中。使用 Pandas:

这样的库很容易做到这一点

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html

>>> pandas.cut([123, 127, 99, 75, 86, 83, 81], 4, labels=False)
array([3, 3, 1, 0, 0, 0, 0])

(上面写着“123 和 127 在第 3 组,99 在第 1 组,75、86、83、81 在第 0 组”)。

聚类

当您不知道这些值但知道它们形成组时,这就是将您的元素分组。

像“1,2,3,11,12,13”显然是两个簇“1,2,3”和“11,12,13”。

聚类数据的一种简单好用的方法是 K-means but there's other algorithms, you should take a look at scipy

>>> import sklearn.cluster
>>> import numpy as np
>>> 
>>> kmeans = sklearn.cluster.KMeans(n_clusters=4)
>>> kmeans.fit_predict(numpy.array([123, 127, 99, 75, 86, 83, 81]).reshape(-1, 1))
array([0, 0, 2, 3, 1, 1, 1], dtype=int32)

这个给了123和127一起,一个给了99,一个给了75,一起给了81 83 86。

分组

这是一个简单的 "GROUP BY" ala SQL,当你可以提供一个函数时,returns 你的值应该是:

喜欢:

>>> from itertools import groupby
>>> for key, group in groupby([123, 127, 99, 75, 86, 83, 81], lambda x: int(x / 10)):
...     print(key, list(group))
... 
12 [123, 127]
9 [99]
7 [75]
8 [86, 83, 81]