如何从列表元素中创建所有可能的组合?

43

我有以下列表:

List(a, b, c, d, e)
如何从上述列表中创建所有可能的组合?
我期望得到类似于:
a
ab
abc 

除了集合(set)之外,它们很相似:https://dev59.com/K2gu5IYBdhLWcg3wGTad - Luigi Plinge
4个回答

96

或者你可以使用subsets方法。不过你需要先将列表转换为集合。

scala> List(1,2,3).toSet[Int].subsets.map(_.toList).toList
res9: List[List[Int]] = List(List(), List(1), List(2), List(3), List(1, 2), List(1, 3), List(2, 3), List(1, 2, 3))

4
我认为这是解决复杂问题的一种简洁方法。 - Shakti
18
除非数字重复。 - Chetan Bhasin
除非列表中有一些重型数据结构,否则将其转换为Set(哈希)会变得非常缓慢。 - Rok Kralj
另外,如果您正在尝试执行任何需要顺序的操作(例如检查具有限定符的零件编号等),转换为集合也会丢失该信息。 - ericpeters
1
@ericpeters,它说的是“组合”,而不是“排列”,因此顺序并不重要 ;) - Carlos Verdes

35
def combine(in: List[Char]): Seq[String] = 
    for {
        len <- 1 to in.length
        combinations <- in combinations len
    } yield combinations.mkString 

真的。但我以前做这件事的方式非常复杂 =P - Tiago Farias
List 上定义的 combinations(length) 方法,将返回一个有限长度的子列表迭代器,该迭代器是由组合原始列表元素的所有可能方式生成的。使用 for 推导式可以获得所有长度在 1 到整个原始列表长度之间的可能组合。<- 左侧分配的 combinations 就是这样一种可能的洗牌方式。 yield 将返回一个包含所有可能组合的列表。请查看文档 - pagoda_5b

10
def powerset[A](s: Set[A]) = s.foldLeft(Set(Set.empty[A])) { case (ss, el) => ss ++ ss.map(_ + el) }

听起来您需要“幂集”(Power set)。这里有相关信息。

10
val xs = List( 'a', 'b' , 'c' , 'd' , 'e' )
(1 to xs.length flatMap (x => xs.combinations(x))) map ( x => x.mkString(""))

这将以空字符串连接所有组合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接