2013-02-19 15 views
6

Mam listę wartości i listę krawędzi bin. Teraz muszę sprawdzić wszystkie wartości, do których bin należą. Czy jest bardziej pythonic sposób niż Iterowanie nad wartościami, a następnie w ciągu pojemników i sprawdzenie, czy wartość należy do obecnego pojemnika, jak:Python: Sprawdzanie, do którego bin należy wartość

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 

To nie wygląda bardzo ładny do mnie. Dzięki!

+0

Zacznij od sortowania listy. –

Odpowiedz

14

prawdopodobnie zbyt późno, ale na przyszłość, numpy posiada funkcję, która właśnie to robi:

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

Wynik jest tablicą wskaźników odpowiadających kosza z pojemniki, które również należą do każdego elementu z mojej listy. Zauważ, że funkcja wartości również na śmieci, które nie mieszczą się w pierwszych i ostatnich bin krawędzi:

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

I Pandy ma coś podobnego też:

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) 
2

Może to pomoże Ci na dobrej drodze:

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

Zastanawiasz się, dlaczego głosowanie w dół. – sberry

3

Przede wszystkim kod zamierza zawieść się na przypadkach, gdy wartość jest równa granicy bin -

zmian

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

mieć gdzieś znak <=.

Po tym, użyć modułu bisect

import bisect 
bisect.bisect(x, bins) 

lub bisect.bisect_right

w zależności od tego, czy wolisz mieć większą lub mniejszą wartość, gdy pojemnik jest na granicy bin.

+1

Myślę, że argumenty "bisect" są odwrócone. – sberry

Powiązane problemy