2016-03-15 76 views
0

我試圖根據Haskell中每個列表中的最後一個元素將列表分組在2dlist中。像這樣:如何按最後一個元素haskell劃分2d列表?

[[0,1],[2,2],[0,2],[1,1]]

要麼成爲三維列表是這樣的:

[[[0,1],[1,1]],[[0,2],[2,2]]]

或將數據分離成使用任何數據結構類別的n個。

具體來說,我想實現seperateByClass方法在本教程中http://machinelearningmastery.com/naive-bayes-classifier-scratch-python/

+2

這不看起來像一個Python問題。 – Mumbleskates

+1

http://stackoverflow.com/questions/12398458/how-to-group-similar-items-in-a-list-using-haskell – alamar

回答

1

目標是轉換

def separateByClass(dataset): 
    separated = {} 
    for i in range(len(dataset)): 
     vector = dataset[i] 
     if (vector[-1] not in separated): 
      separated[vector[-1]] = [] 
     separated[vector[-1]].append(vector) 
    return separated 


dataset = [[1,20,1], [2,21,0], [3,22,1]] 
separated = separateByClass(dataset) 
print('Separated instances: {0}').format(separated) 

已經輸出

Separated instances: {0: [[2, 21, 0]], 1: [[1, 20, 1], [3, 22, 1]]} 

哈斯克爾。這是Data.MapfromListWith :: Ord k => (a -> a -> a) -> [(k, a)] -> Map k a的完美用例,它包含鍵值對的列表以及兩對碰巧共享相同密鑰時組合值的策略。

λ> import Data.Maybe 
λ> import Data.Map 
λ> let last_ = listToMaybe . reverse 
λ> let pairs = [(last_ x, [x]) | x <- dataset] 

λ> fromListWith (\a b -> b) pairs 
fromList [(Just 0,[[2,21,0]]),(Just 1,[[1,20,1]])] 

λ> fromListWith (++) pairs 
fromList [(Just 0,[2,21,0]),(Just 1,[3,22,1,1,20,1])] 

λ> fromListWith (++) pairs 
fromList [(Just 0,[[2,21,0]]),(Just 1,[[3,22,1],[1,20,1]])] 

偉大的工作,哈斯克爾。

+0

什麼是listToMaybe – hgund

+0

@ user4485835一個安全的可能版本的頭。看到文檔! – hao

1
import Data.List(groupBy, sortBy) 
import Data.Ord(compare) 

groupBy (\x y -> x!!1==y!!1) $ sortBy (\x y -> compare (x!!1) (y!!1)) [[0,1],[2,2],[0,2],[1,1]] 
[[[0,1],[1,1]],[[2,2],[0,2]]] 

,或者更改索引訪問將持續

groupBy (\x y -> last x==last y) $ sortBy (\x y -> compare (last x) (last y)) [[0,1],[2,2],[0,2],[1,1]] 
[[[0,1],[1,1]],[[2,2],[0,2]]] 

也許更容易一些輔助功能

compareLast x y = compare (last x) (last y) 
equalLast x y = EQ == compareLast x y 

groupBy equalLast $ sortBy compareLast [[0,1],[2,2],[0,2],[1,1]] 
[[[0,1],[1,1]],[[2,2],[0,2]]] 

或者,再往前一步

compareBy f x y = compare (f x) (f y) 
equalBy f = ((EQ ==) .) . compareBy f 
partitionBy f = groupBy (equalBy f) . sortBy (compareBy f) 

partitionBy last [[0,1],[2,2],[0,2],[1,1]] 
[[[0,1],[1,1]],[[2,2],[0,2]]] 
相關問題