2012-04-04 53 views
5

我有一個列表:蟒集團整數的列表,就近值

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

我怎樣才能與動態間隙組最近的值,並創建這樣一個元組,什麼是最快的方法是什麼? :

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

k均值聚類。 – 2012-04-04 18:12:02

+4

你如何定義「最近值」?在我看來,102根本不接近109,屬於它自己的組。你有一個客觀的方法來確定分組嗎? – Kevin 2012-04-04 18:13:07

+0

我同意凱文。這一切都非常arbritrary - 這很好 - 你只需要更具體地定義你想如何分割數字,以及你如何不喜歡他們分裂。 – 2012-04-04 18:14:27

回答

10

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

拳我們計算時序元件,然後一起組元件,其差小於平均值之間的平均差值。

+0

謝謝,這個作品 – pylover 2012-04-04 18:24:12

+0

@ thg435:+1。這真的很聰明。但是,如果'd = [1,2,4,5]',那麼'm'變成'[[1],[2],[4],[5]]'而不是'[[1,2]], [4,5]]。我認爲這可以通過在範圍(len(data)-1)]中將'diff'更改爲'diff = [data [i + 1] -data [i]'並且將條件更改爲'x-m [ -1] [ - 1] unutbu 2012-04-04 19:32:39