gpt4 book ai didi

带条件列表的 Scala 分布

转载 作者:行者123 更新时间:2023-12-02 02:54:56 28 4
gpt4 key购买 nike

所以,这非常简单,我有一个包含嵌套列表的列表,如下所示:

List(
*list1* List(List("n1", "n3"), List("n1", "n4"), List("n3", "n4")),
*list2* List(List("n2"), List("n3"), List("n4"))
)

我想用 list2 的列表分配 list1 的列表,如下所示:

List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n3), List(n3)),
List(List(n1, n4), List(n3)),
List(List(n3, n4), List(n3)),
List(List(n1, n3), List(n4)),
List(List(n1, n4), List(n4)),
List(List(n3, n4), List(n4))
)

这可以通过以下函数来完成:

def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.map(t => t::r))
}

问题是,我想添加一个条件,我只分发没有重复的列表,所以结果是:

List(
List(List(n1, n3), List(n2)),
List(List(n1, n4), List(n2)),
List(List(n3, n4), List(n2)),
List(List(n1, n4), List(n3)),
List(List(n1, n3), List(n4)),
)

我最接近的是在映射之前添加一个过滤器和一个包含,但我仍然无法得到结果,如下所示:

def combinationList[T](ls:List[List[T]]):List[List[T]] = ls match {
case Nil => Nil::Nil
case head :: tail => val rec = combinationList[T](tail)
rec.flatMap(r => head.filter(x => !r.contains(x)).map(t => t::r))
}

问题是我认为它是将列表作为一个整体进行比较,而不是单个元素。有什么想法吗?

编辑:我需要忽略函数中的重复项。我知道可以对信息进行后处理并删除重复的信息,但这不是我想要的。

最佳答案

需要进一步分解一层来检查item是否存在,最简单的形式如下:

def combinationList[T](ls:List[List[List[T]]]) : List[List[List[T]]] = ls match {
case head :: tail :: Nil =>
for {
hl <- head
tl <- tail
if !tl.forall(te => hl.contains(te))
} yield List(hl, tl)
}

它假设输入列表有 2 个子列表。我不确定以通用方式拥有 3 个或更多子列表的期望是什么,这完全取决于您是否进一步递归。

关于带条件列表的 Scala 分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49958875/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com