114 votes

Fractionner la liste en plusieurs listes avec un nombre fixe d'éléments

Comment diviser une liste d'éléments en listes comportant au plus N éléments?

ex: Avec une liste de 7 éléments, créez des groupes de 4, en laissant éventuellement le dernier groupe avec moins d'éléments.

 split(List(1,2,3,4,5,6,"seven"),4)

=> List(List(1,2,3,4), List(5,6,"seven"))
 

199voto

Kipton Barros Points 12445

Je pense que vous recherchez grouped . Il retourne un itérateur, mais vous pouvez convertir le résultat en liste,

 scala> List(1,2,3,4,5,6,"seven").grouped(4).toList
res0: List[List[Any]] = List(List(1, 2, 3, 4), List(5, 6, seven))
 

8voto

Luigi Plinge Points 23552

Ou si vous voulez faire votre propre:

def split[A](xs: List[A], n: Int): List[List[A]] = {
  if (xs.size <= n) xs :: Nil
  else (xs take n) :: split(xs drop n, n)
}

Utilisation:

scala> split(List(1,2,3,4,5,6,"seven"), 4)
res15: List[List[Any]] = List(List(1, 2, 3, 4), List(5, 6, seven))

edit: lors de l'examen de cet 2 ans plus tard, je ne recommande pas cette application depuis l' size O(n), et donc cette méthode est O(n^2), ce qui pourrait expliquer pourquoi la méthode intégrée devient plus rapide pour les grandes listes, comme indiqué dans les commentaires ci-dessous. Vous pourriez mettre en œuvre efficacement comme suit:

def split[A](xs: List[A], n: Int): List[List[A]] =
  if (xs.isEmpty) Nil 
  else (xs take n) :: split(xs drop n, n)

ou encore (un peu) plus efficacement à l'aide d' splitAt:

def split[A](xs: List[A], n: Int): List[List[A]] =
  if (xs.isEmpty) Nil 
  else {
    val (ys, zs) = xs.splitAt(n)   
    ys :: split(zs, n)
  }

0voto

Hydrosan Points 30

Je pense que ceci est l'implémentation utilisant splitAt au lieu de prendre / déposer

 def split [X] (n:Int, xs:List[X]) : List[List[X]] =
    if (xs.size <= n) xs :: Nil
    else   (xs.splitAt(n)._1) :: split(n,xs.splitAt(n)._2)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X