-->

的Python:检查到完事值属于(Python: Checking to which bin a v

2019-07-20 02:53发布

我有值的列表和料箱边缘的列表。 现在,我需要检查什么斌他们属于所有值。 难道还有比遍历值,然后在垃圾桶,并检查是否值属于当前二进制更像一个Python的方式:

my_list = [3,2,56,4,32,4,7,88,4,3,4]
bins = [0,20,40,60,80,100]

for i in my_list:
    for j in range(len(bins)):
        if bins(j) < i < bins(j+1):
            DO SOMETHING

这看起来并不很漂亮给我。 谢谢!

Answer 1:

可能为时已晚,但以供将来参考,numpy的有,不只是一个函数:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

>>> my_list = [3,2,56,4,32,4,7,88,4,3,4]
>>> bins = [0,20,40,60,80,100]
>>> np.digitize(my_list,bins)
array([1, 1, 3, 1, 2, 1, 1, 5, 1, 1, 1])

其结果是对应于从仓仓从my_list每个元素属于太索引的阵列。 请注意,该函数将落在你的第一个和最后一个窗口的边缘之外还二进制数值:

>>> my_list = [-5,200]
>>> np.digitize(my_list,bins)
array([0, 6])

和熊猫有类似的东西太多:

http://pandas.pydata.org/pandas-docs/dev/basics.html#discretization-and-quantiling

>>> pd.cut(my_list, bins)
Categorical: 
array(['(0, 20]', '(0, 20]', '(40, 60]', '(0, 20]', '(20, 40]', '(0, 20]',
       '(0, 20]', '(80, 100]', '(0, 20]', '(0, 20]', '(0, 20]'], dtype=object)
Levels (5): Index(['(0, 20]', '(20, 40]', '(40, 60]', '(60, 80]',
                   '(80, 100]'], dtype=object)


Answer 2:

首先,你的代码是要在失败的情况下,当值等于一个区边界 -

更改

if bins(j) < i < bins(j+1):

有一个<=签署某处。

在此之后,使用bisect模块

import bisect
bisect.bisect(x, bins)

bisect.bisect_right

这取决于你是否更愿意采取高或低仓当值的区边界上。



Answer 3:

也许这将帮助你在正确的轨道上:

>>> import itertools
>>> my_list = [3,2,56,4,32,4,7,88,4,3,4]
>>> for k, g in itertools.groupby(sorted(my_list), lambda x: x // 20 * 20):
...     print k, list(g)
... 
0 [2, 3, 3, 4, 4, 4, 4, 7]
20 [32]
40 [56]
80 [88]


文章来源: Python: Checking to which bin a value belongs