2012-04-04 13 views
5

Ho una lista:gruppo pitone un elenco di numeri interi, con valori più vicini

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

come posso gruppo valori più vicine con gap dinamico, e creare una tupla come questo, qual è il metodo più veloce? :

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

k-means clustering. –

+4

come si definiscono i "valori più vicini"? A mio parere, 102 non è affatto vicino a 109 e appartiene al suo stesso gruppo. Hai un modo oggettivo per determinare il raggruppamento? – Kevin

+0

Sono d'accordo con Kevin. È tutto molto arbritratico, il che va bene, devi solo definire in modo specifico come vorresti dividere i numeri e anche come NON vorresti che venissero divisi. –

risposta

10

Come

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

Pugno calcoliamo una differenza media tra elementi sequenziali e poi raggruppare elementi la cui differenza è inferiore alla media.

+0

grazie, questo funziona – pylover

+0

@ thg435: +1. Questo è davvero intelligente. Tuttavia, se 'd = [1,2,4,5]' allora 'm' diventa' [[1], [2], [4], [5]] 'invece di' [[1, 2], [4, 5]] '. Penso che questo possa essere corretto cambiando 'diff' in' diff = [data [i + 1] -data [i] per i in range (len (data) -1)] 'e la condizione a' x - m [ -1] [- 1] unutbu

Problemi correlati