2012-04-04 8 views
5

Ich habe eine Liste:Python Gruppe eine Liste von Integer, mit nächstgelegenen Werten

d = [23,67,110,25,69,24,102,109] 

wie kann ich Gruppe am nächsten Wert mit dynamischer Lücke, und erstellen Sie ein Tupel wie diese, was ist die schnellste Methode? :

[(23,24,25),(67,69),(102,109,110)] 
+2

k-bedeutet Clustering. –

+4

Wie definieren Sie "nächste Werte"? Meiner Meinung nach ist 102 nicht annähernd 109 und gehört in eine eigene Gruppe. Haben Sie eine objektive Möglichkeit, die Gruppierung zu bestimmen? – Kevin

+0

Ich stimme Kevin zu. Es ist alles sehr willkürlich - was in Ordnung ist - Sie müssen nur genauer definieren, wie Sie die Zahlen teilen möchten und auch, wie Sie nicht möchten, dass sie gespalten werden. –

Antwort

10

Wie

d = [23,67,110,25,69,24,102,109] 

d.sort() 

diff = [y - x for x, y in zip(*[iter(d)] * 2)] 
avg = sum(diff)/len(diff) 

m = [[d[0]]] 

for x in d[1:]: 
    if x - m[-1][0] < avg: 
     m[-1].append(x) 
    else: 
     m.append([x]) 


print m 
## [[23, 24, 25], [67, 69], [102, 109, 110]] 

Faust wir eine durchschnittliche Differenz zwischen aufeinanderfolgenden Elementen zu berechnen und dann Elemente gruppieren, deren Differenz kleiner als der Durchschnitt.

+0

danke, das funktioniert – pylover

+0

@ thg435: +1. Das ist wirklich schlau. Wenn jedoch "d = [1,2,4,5]", dann wird "m" "[[1], [2], [4], [5]]" anstelle von "[[1, 2], [4, 5]]. Ich denke, das kann behoben werden, indem man "diff" in "diff = [data [i + 1] -data [i] für i im Bereich (len (data) -1)]' 'und die Bedingung in' x-m [ -1] [- 1] . – unutbu

Verwandte Themen