2012-04-04 13 views
5

साथ पूर्णांक की एक सूची है, मैं एक सूची है:अजगर समूह निकटतम मान

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

मैं कैसे समूह गतिशील अंतराल के साथ निकटतम मूल्यों, और इस तरह एक टपल बना सकते हैं, सबसे तेजी से विधि क्या है? :

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

के-मतलब क्लस्टरिंग। –

+4

आप "निकटतम मूल्य" को कैसे परिभाषित करते हैं? मेरी राय में, 102 109 के करीब नहीं है, और अपने समूह में है। क्या आपके पास समूहीकरण का निर्धारण करने का एक उद्देश्य है? – Kevin

+0

मैं केविन से सहमत हूं। यह सब बहुत ही मनमाना है - जो ठीक है - आपको बस विशेष रूप से परिभाषित करना होगा कि आप संख्याओं को कैसे विभाजित करना चाहते हैं और यह भी कि आप उन्हें कैसे विभाजित नहीं करना चाहते हैं। –

उत्तर

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

+0

@ thg435: +1 काम करता है। यह वास्तव में चालाक है। हालांकि, अगर 'डी = [1,2,4,5]' तो 'एम 'बन जाता है [[1], [2], [4], [5]]' [[1, 2] के बजाय, [4, 5]] '। मुझे लगता है कि यह 'diff' से 'diff = [डेटा [i + 1] -डेटा [i] में रेंज (लेन (डेटा) -1)] के लिए बदलकर तय किया जा सकता है और' x-m की स्थिति [ -1] [- 1] <औसत '। – unutbu

संबंधित मुद्दे