0

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

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

有任何想法吗?

4

1 回答 1

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 组中”)。

聚类

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

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

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]
于 2015-10-28T23:49:51.477 回答