Scala从列表中生成唯一对

Scala从列表中生成唯一对,scala,functional-programming,Scala,Functional Programming,输入: 期望输出: val list = List(1, 2, 3, 4) 此代码适用于: Iterator((1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)) (cur1)的: 它返回一个迭代器,但我添加了.toList,只是为了打印结果。如果希望结果以元组形式显示,可以执行以下操作: scala> List(1,2,3,4).combinations(2).toList res0: List[List[Int]] = List(List(

输入:

期望输出:

val list = List(1, 2, 3, 4)
此代码适用于:

Iterator((1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4))
(cur1)的

它返回一个
迭代器
,但我添加了
.toList
,只是为了打印结果。如果希望结果以元组形式显示,可以执行以下操作:

scala> List(1,2,3,4).combinations(2).toList
res0: List[List[Int]] = List(List(1, 2), List(1, 3), List(1, 4), List(2, 3), List(2, 4), List(3, 4))

您还提到了唯一性,因此您可以将
.distinct
应用于输入列表唯一性并不是您功能的先决条件,因为
.composition
不会对您进行重复数据消除。

.compositions是生成任意大小的唯一组的正确方法,这是另一种不需要检查的替代解决方案k唯一性首先在于使用foldLeft的方式:

scala> List(1,2,3,4).combinations(2).map{ case Seq(x, y) => (x, y) }.toList
res1: List[(Int, Int)] = List((1,2), (1,3), (1,4), (2,3), (2,4), (3,4))
将产生:

val list = (1 to 10).toList

val header :: tail = list
tail.foldLeft((header, tail, List.empty[(Int, Int)])) {
  case ((header, tail, res), elem) =>
    (elem, tail.drop(1), res ++ tail.map(x => (header, x)))
}._3
如果您希望有重复项,那么您可以将输出列表转换为一个集合,并将其返回到列表中,但您将失去排序。因此,如果您希望具有唯一性,则不建议使用这种方法,但如果您希望生成包含相等元素的所有对,则应首选这种方法


例如,我在机器学习领域使用它来生成特征空间中每对变量之间的所有产品,如果两个或多个变量具有相同的值,我仍然希望生成与其产品对应的新变量,即使这些新生成的“交互变量”将有重复项。

这正是我要寻找的thx。所谓唯一性,我的意思是没有(1,2)和(2,1)项result@Co_42:可选解决方案:
list.tails.collect{case h::tail=>tail map{(h,{}}.flatte.toList
@senia:你应该回答这个问题
val list = (1 to 10).toList

val header :: tail = list
tail.foldLeft((header, tail, List.empty[(Int, Int)])) {
  case ((header, tail, res), elem) =>
    (elem, tail.drop(1), res ++ tail.map(x => (header, x)))
}._3
res0: List[(Int, Int)] = List((1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (1,8), (1,9), (1,10), (2,3), (2,4), (2,5), (2,6), (2,7), (2,8), (2,9), (2,10), (3,4), (3,5), (3,6), (3,7), (3,8), (3,9), (3,10), (4,5), (4,6), (4,7), (4,8), (4,9), (4,10), (5,6), (5,7), (5,8), (5,9), (5,10), (6,7), (6,8), (6,9), (6,10), (7,8), (7,9), (7,10), (8,9), (8,10), (9,10))