2012-04-04 16 views
5

Tengo una lista:grupo pitón una lista de número entero, con valores cercanos

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

cómo puedo grupo valores más cercanos con Gap dinámico, y crear una tupla como este, ¿cuál es el método más rápido? :

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

k-means clustering. –

+4

¿cómo se definen los "valores más cercanos"? En mi opinión, 102 no está cerca de 109 en absoluto, y pertenece a su propio grupo. ¿Tiene una forma objetiva de determinar la agrupación? – Kevin

+0

Estoy de acuerdo con Kevin. Todo es muy arquitrario, lo cual está bien, solo tienes que definir más específicamente cómo te gustaría dividir los números y también cómo NO te gustaría que se dividan. –

Respuesta

10

Como

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

Puño calculamos una diferencia promedio entre los elementos secuenciales y luego agrupando elementos cuya diferencia es menor que el promedio.

+0

gracias, esto funciona – pylover

+0

@ thg435: +1. Esto es realmente inteligente. Sin embargo, si 'd = [1,2,4,5]' entonces 'm' se convierte en' [[1], [2], [4], [5]] 'en lugar de' [[1, 2], [4, 5]] '. Creo que esto se puede solucionar cambiando 'diff' a' diff = [data [i + 1] -data [i] para i en rango (len (data) -1)] 'y la condición para' x - m [ -1] [- 1] unutbu

Cuestiones relacionadas