我有一个包含以下数据的列表列表
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
答案 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)