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

时间:2015-10-28 18:41:29

标签: python python-2.7 python-collections

在python中,我们可以使用counter来查找列表中最常见的元素。 有没有办法可以传递函数,这样我们就可以对抗落在一定范围内的元素。

说我有[123,127,99,75,86,83,81],我想要回复{'12X':2,'8X':3,'99':1,'75 “:1}

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

根据具体情况,您尝试做的事情可能是:

分级

将您的元素分组到相同大小或预定义的离散箱/桶中。使用像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组和第34组中)。

聚类

当你不知道价值观时,你将你的元素分组,但知道它们形成了群体。

喜欢" 1,2,3,11,12,13和#34;显然是两个集群" 1,2,3和#34;和" 11,12,13和#34;。

一种简单易用的群集数据方法是K-means但是还有其他算法,你应该看看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,当你可以提供一个函数来返回你的值应该是的组:

像:

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