2012-04-04 26 views
5

Tôi có một danh sách:python nhóm một danh sách các số nguyên, với giá trị gần

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

làm thế nào tôi nhóm các giá trị gần nhất với khoảng cách năng động, và có thể tạo ra một tuple như thế này, phương pháp nhanh nhất là gì? :

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

k-means clustering. –

+4

làm thế nào để bạn xác định "giá trị gần nhất"? Theo tôi, 102 không phải là gần 109, và thuộc về nhóm riêng của nó. Bạn có một cách khách quan để xác định nhóm? – Kevin

+0

Tôi đồng ý với Kevin. Đó là tất cả rất arbritrary - đó là tốt - bạn chỉ cần xác định cụ thể hơn như thế nào bạn muốn chia các con số và cũng làm thế nào bạn sẽ không thích chúng được chia. –

Trả lời

10

Giống như

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

Fist chúng tôi tính toán một sự khác biệt trung bình giữa các yếu tố liên tục và sau đó nhóm lại với nhau các yếu tố có sự khác biệt là ít hơn mức trung bình.

+0

cảm ơn, công trình này – pylover

+0

@ thg435: +1. Điều này thực sự thông minh. Tuy nhiên, nếu 'd = [1,2,4,5]' thì 'm' trở thành' [[1], [2], [4], [5]] 'thay vì' [[1, 2], [4, 5]] '. Tôi nghĩ rằng điều này có thể được cố định bằng cách thay đổi 'diff' thành' diff = [dữ liệu [i + 1] -data [i] cho i trong phạm vi (len (dữ liệu) -1)] 'và điều kiện thành' x - m [ -1] [- 1] unutbu

Các vấn đề liên quan