Scala列表列表计数每个子列表索引的不同元素

时间:2014-10-10 20:58:35

标签: list scala

我有一个包含以下数据的列表列表

  

val list = List(List(“a”,“b”,“c”),List(“d”,“e”,“f”),List(“a”,“a”,“a) “))

我想要忽略在子列表的每个位置有多少不同的数据

  

1 - >列表(“a”,“d”,“a”)

     

2 - >列表(“b”,“e”,“a”)

     

3 - >列表( “C”, “F”, “A”)

有办法吗?它不需要被索引,但我需要每个子列表索引的不同值的数量,结果也可能是

  

2 //不同的值a和d

     

3 //不同的值b,e和a

     

3 //不同的值c,f和a

3 个答案:

答案 0 :(得分:4)

正如我在对Jhonny Everson(几乎正确但现已删除)的回答中所述,您可以使用transpose获取列的列表,然后distinct删除重复项:

scala> list.transpose.map(_.distinct.size)
res0: List[Int] = List(2, 3, 3)

如果所有列表的大小不同,则会抛出异常,但这可能就是您想要的。

答案 1 :(得分:0)

scala> list.transpose.map(_.toSet.size)
res0: List[Int] = List(2, 3, 3)

list.transpose的输出为List(List(a, d, a), List(b, e, a), List(c, f, a)),为您提供所需的结构,然后将每个List映射到Set以获取唯一元素并对其进行计数。

如果您想要每个位置的唯一元素,那么您可以使用zipWithIndex并反转输出。

scala> list.transpose.map(_.distinct).zipWithIndex.map(t => t._2 -> t._1)
res1: List[(Int, List[String])] = List((0,List(a, d)), (1,List(b, e, a)), (2,List(c, f,   a)))

答案 2 :(得分:-1)

以下是您想要的代码:

var lOfl = List(List.range(1,5), List(2,2,2,3), Nil)
   //> lOfl  : List[List[Int]] = List(List(1, 2, 3, 4), List(2, 2, 2, 3), List())
for {
   l <- lOfl
} yield l.toSet.count(_ => true)  //> res1: List[Int] = List(4, 2, 0)

Int列表的样本列表创建为lOfl; for循环遍历每个Int列表; toSet转换列表以设置消除重复元素。然后计数功能就像名字所说的一样。  或者使用Scala最常用的收集功能(:P:P),地图,如下所示,

  lOfl.map(l => l.toSet.count(_ => true) )       //> res2: List[Int] = List(4, 2, 0)