2016-03-15 44 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]]] 
相关问题