2012-04-04 19 views
5

Mam listę:grupa pyton wykaz liczby całkowitej, z najbliższej wartości

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

jak mogę Grupa najbliższej wartości z dynamicznym luki i stworzenie krotki takiego, jaki jest najszybszy sposób? :

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

k-oznacza grupowanie. –

+4

jak zdefiniować "najbliższe wartości"? Moim zdaniem 102 w ogóle nie jest bliskie 109 i należy do własnej grupy. Czy masz obiektywny sposób określania grupowania? – Kevin

+0

Zgadzam się z Kevinem. Wszystko to jest bardzo arbritrary - co jest w porządku - musisz po prostu dokładniej zdefiniować, w jaki sposób chcesz podzielić liczby, a także, jak NIE chciałbyś ich podzielić. –

Odpowiedz

10

jak

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

pięści obliczyć średnią różnicę pomiędzy kolejnymi elementami, a następnie grupy wraz elementami, których różnica jest mniejsza niż średnia.

+0

dziękuje, działa – pylover

+0

@ thg435: +1. To jest naprawdę sprytne. Jednakże jeśli 'd = [1,2,4,5]' to 'm' staje się' [[1], [2], [4], [5]] 'zamiast' [[1, 2], [4, 5]] ". Myślę, że można to naprawić zmieniając 'diff' na' diff = [dane [i + 1] -data [i] dla i w zakresie (len (dane) -1)] 'a warunek na' x - m [ -1] [- 1] <śr. ". – unutbu