2016-10-28 3 views
0

Ich habe eine Liste von Zahlen und ich muss es gruppieren. itertools.grouby Arbeit perfekt für Sequenzen von gleichen Zahlen, aber ich brauche gleiches Verhalten für Zahlen mit einem Schwellenwert (2-3%)Python groupby Schwelle

E.X: lst = [1, 500, 19885, 19886, 19895, 90000000] und ich erwarte [[1], [500], [19885, 19886, 19895], [90000000]]

Können Sie mir etwas?

Antwort

1

Sie können immer noch groupby verwenden aber einen benutzerdefinierten Komparator verwenden:

class MyValue: 
    def __init__(self, val): 
     self.val = val 
    def __eq__(self, other): 
     # 2% leeway 
     return self.val*0.98 <= other.val <= self.val*1.02 

Und dann:

for key, group in groupby(map(MyValue, values)): 
    group_values = [el.val for el in group] 

Beachten Sie, dass dies der erste Wert als „Referenz“ halten wird so in einer Gruppe, die Sie‘ ll haben die Elemente sind bis zu 2% vom Schlüssel/ersten Wert entfernt, aber innerhalb der Gruppe könnte die Abweichung bis zu 4% gehen.

Dies sollte in Ordnung mit den Daten, die Sie gezeigt haben, wenn die verschiedenen Gruppen deutlich voneinander getrennt sind, aber es wird nicht zuverlässig mit engen Gruppen sein.

+0

sehr nett! Für das äquivalente Ergebnis schreibe 'res = [[el.val für el in g] für key, g in groupby (map (MyValue, values))]' anstelle des zweiten Codeblocks. – hvwaldow

+0

genial, immer über magische Methoden vergessen. Ich werde es benutzen – struckoff

0

Eimer sie. Sie müssten die Pausen im Voraus manuell ausarbeiten. Kannst du dann im Voraus sortieren? Das würde es einfacher machen.

Tatsächlich, wenn Sie log verwenden, dann wird ein multiplikativer Schwellenwert zu einem konstanten Schwellenwert, z. 0.98..1.02 in Log-Land ~ = (-0.02, +0.02). Also, verwenden Sie das Protokoll aller Ihrer Zahlen. Du musst sie immer noch mit einem Eimer füllen, bevor du groupby machst.

Wenn Sie Code möchten, geben Sie uns ein besseres (zufällig gesetztes) reproduzierbares Beispiel, das mehr Zahlen hat, die die Eckfälle testen.

+0

Was meinst du über Eimer? eigentlich kann ich es nicht sortieren, weil Ordnung notwendig ist. – struckoff

+0

"Bucket" bedeutet "Teilen Sie den Bereich in Bins auf und verwenden Sie den quantisierten Wert zum Zwecke der Gruppierung" - ähnlich wie bei @Bakuriu. Genau wie in einem Histogramm. – smci