Skip to content

Split ​

Split a list into runs of identical adjacent elements.

✓ checked against that system · ! checked, with disagreements (hover a chip)Wolfram LanguageSplit✓
Split(list)runs of adjacent equal elements.
Split(list, test)runs on which adjacent elements agree by a custom two-argument test.
Typed signatures
TypePackageApplies
(indexed_collection<T>, ((T, T) any -> boolean)?) -> list<list<T>> where Tcombinatoricsalways

Domain: Collections

Details
  • Runs, not groups: only ADJACENT equal elements join a run, so the same value can appear in several separate runs. See Gather to group every occurrence together regardless of position.

Examples

Basic #

Runs, not groups: the two runs of 1 stay apart

live ↗
InSplit([1,1,2,2,2,3,1,1])\mathrm{Split}(\bigl\lbrack1, 1, 2, 2, 2, 3, 1, 1\bigr\rbrack)Out[[1,1],[2,2,2],[3],[1,1]]\bigl\lbrack\bigl\lbrack1, 1\bigr\rbrack, \bigl\lbrack2, 2, 2\bigr\rbrack, \bigl\lbrack3\bigr\rbrack, \bigl\lbrack1, 1\bigr\rbrack\bigr\rbrack

Symbolic elements

live ↗
InSplit([a,a,b,b,b,a])\mathrm{Split}(\bigl\lbrack a, a, b, b, b, a\bigr\rbrack)Out[[a,a],[b,b,b],[a]]\bigl\lbrack\bigl\lbrack a, a\bigr\rbrack, \bigl\lbrack b, b, b\bigr\rbrack, \bigl\lbrack a\bigr\rbrack\bigr\rbrack

Runs of equal neighbours are grouped

live ↗
InSplit([a,a,a,b,b,a,a,c])\mathrm{Split}(\bigl\lbrack a, a, a, b, b, a, a, c\bigr\rbrack)Out[[a,a,a],[b,b],[a,a],[c]]\bigl\lbrack\bigl\lbrack a, a, a\bigr\rbrack, \bigl\lbrack b, b\bigr\rbrack, \bigl\lbrack a, a\bigr\rbrack, \bigl\lbrack c\bigr\rbrack\bigr\rbrack
Scope #

A test between neighbours: split into increasing runs

live ↗
InSplit([1,2,3,5,4,6],Less)\mathrm{Split}(\bigl\lbrack1, 2, 3, 5, 4, 6\bigr\rbrack, \mathrm{Less})Out[[1,2,3,5],[4,6]]\bigl\lbrack\bigl\lbrack1, 2, 3, 5\bigr\rbrack, \bigl\lbrack4, 6\bigr\rbrack\bigr\rbrack

The empty list

live ↗
InSplit([])\mathrm{Split}(\bigl\lbrack\bigr\rbrack)Out[]\bigl\lbrack\bigr\rbrack

Breaks wherever the list stops increasing, giving increasing runs

live ↗
InSplit([1,2,3,4,3,2,1,5,6,7,4,3],Less)\mathrm{Split}(\bigl\lbrack1, 2, 3, 4, 3, 2, 1, 5, 6, 7, 4, 3\bigr\rbrack, \mathrm{Less})Out[[1,2,3,4],[3],[2],[1,5,6,7],[4],[3]]\bigl\lbrack\bigl\lbrack1, 2, 3, 4\bigr\rbrack, \bigl\lbrack3\bigr\rbrack, \bigl\lbrack2\bigr\rbrack, \bigl\lbrack1, 5, 6, 7\bigr\rbrack, \bigl\lbrack4\bigr\rbrack, \bigl\lbrack3\bigr\rbrack\bigr\rbrack

Breaks wherever the list stops decreasing

live ↗
InSplit([1,2,3,4,3,2,1,5,6,7,4,3],Greater)\mathrm{Split}(\bigl\lbrack1, 2, 3, 4, 3, 2, 1, 5, 6, 7, 4, 3\bigr\rbrack, \mathrm{Greater})Out[[1],[2],[3],[4,3,2,1],[5],[6],[7,4,3]]\bigl\lbrack\bigl\lbrack1\bigr\rbrack, \bigl\lbrack2\bigr\rbrack, \bigl\lbrack3\bigr\rbrack, \bigl\lbrack4, 3, 2, 1\bigr\rbrack, \bigl\lbrack5\bigr\rbrack, \bigl\lbrack6\bigr\rbrack, \bigl\lbrack7, 4, 3\bigr\rbrack\bigr\rbrack

Groups primes whose consecutive gaps are below 44

live ↗
InSplit(Array(NthPrime,20),(_1⁡,_2⁡)↦_2⁡−_1⁡<4)\mathrm{Split}(\mathrm{Array}(\mathrm{NthPrime}, 20), (\operatorname{\_1}, \operatorname{\_2})↦\operatorname{\_2}-\operatorname{\_1}\lt4)Out[[2,3,5,7],[11,13],[17,19],[23],[29,31],[37],[41,43],[47],[53],[59,61],[67],[71]]\bigl\lbrack\bigl\lbrack2, 3, 5, 7\bigr\rbrack, \bigl\lbrack11, 13\bigr\rbrack, \bigl\lbrack17, 19\bigr\rbrack, \bigl\lbrack23\bigr\rbrack, \bigl\lbrack29, 31\bigr\rbrack, \bigl\lbrack37\bigr\rbrack, \bigl\lbrack41, 43\bigr\rbrack, \bigl\lbrack47\bigr\rbrack, \bigl\lbrack53\bigr\rbrack, \bigl\lbrack59, 61\bigr\rbrack, \bigl\lbrack67\bigr\rbrack, \bigl\lbrack71\bigr\rbrack\bigr\rbrack
live ↗
InSplit([a,a,a,b,a,b,b,a,a,a,c,a],UnsameQ)\mathrm{Split}(\bigl\lbrack a, a, a, b, a, b, b, a, a, a, c, a\bigr\rbrack, \mathrm{UnsameQ})Out[[a],[a],[a],[b],[a],[b],[b],[a],[a],[a],[c],[a]]\bigl\lbrack\bigl\lbrack a\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack b\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack b\bigr\rbrack, \bigl\lbrack b\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack a\bigr\rbrack, \bigl\lbrack c\bigr\rbrack, \bigl\lbrack a\bigr\rbrack\bigr\rbrack
Applications #

Sorting first merges all equal elements into one run each

live ↗
InSplit(Sort([a,a,a,b,b,a,a,c,c,c]))\mathrm{Split}(\mathrm{Sort}(\bigl\lbrack a, a, a, b, b, a, a, c, c, c\bigr\rbrack))Out[[a,a,a,a,a],[b,b],[c,c,c]]\bigl\lbrack\bigl\lbrack a, a, a, a, a\bigr\rbrack, \bigl\lbrack b, b\bigr\rbrack, \bigl\lbrack c, c, c\bigr\rbrack\bigr\rbrack

Splits wherever the sign changes

live ↗
InSplit([3,0,−4,3,3,−2,0,−3,−4,5],(_1⁡,_2⁡)↦sgn(_1⁡)=sgn(_2⁡))\mathrm{Split}(\bigl\lbrack3, 0, -4, 3, 3, -2, 0, -3, -4, 5\bigr\rbrack, (\operatorname{\_1}, \operatorname{\_2})↦\mathrm{sgn}(\operatorname{\_1})=\mathrm{sgn}(\operatorname{\_2}))Out[[3],[0],[−4],[3,3],[−2],[0],[−3,−4],[5]]\bigl\lbrack\bigl\lbrack3\bigr\rbrack, \bigl\lbrack0\bigr\rbrack, \bigl\lbrack-4\bigr\rbrack, \bigl\lbrack3, 3\bigr\rbrack, \bigl\lbrack-2\bigr\rbrack, \bigl\lbrack0\bigr\rbrack, \bigl\lbrack-3, -4\bigr\rbrack, \bigl\lbrack5\bigr\rbrack\bigr\rbrack

Splits only where a negative is followed by a positive

live ↗
InSplit([3,0,−4,3,3,−2,0,−3,−4,5],(_1⁡,_2⁡)↦¬(sgn(_1⁡)<0∧0<sgn(_2⁡)))\mathrm{Split}(\bigl\lbrack3, 0, -4, 3, 3, -2, 0, -3, -4, 5\bigr\rbrack, (\operatorname{\_1}, \operatorname{\_2})↦¬(\mathrm{sgn}(\operatorname{\_1})\lt0∧0\lt\mathrm{sgn}(\operatorname{\_2})))Out[[3,0,−4],[3,3,−2,0,−3,−4],[5]]\bigl\lbrack\bigl\lbrack3, 0, -4\bigr\rbrack, \bigl\lbrack3, 3, -2, 0, -3, -4\bigr\rbrack, \bigl\lbrack5\bigr\rbrack\bigr\rbrack

Splits only where a positive is followed by a negative

live ↗
InSplit([3,0,−4,3,3,−2,0,−3,−4,5],(_1⁡,_2⁡)↦¬(0<sgn(_1⁡)∧sgn(_2⁡)<0))\mathrm{Split}(\bigl\lbrack3, 0, -4, 3, 3, -2, 0, -3, -4, 5\bigr\rbrack, (\operatorname{\_1}, \operatorname{\_2})↦¬(0\lt\mathrm{sgn}(\operatorname{\_1})∧\mathrm{sgn}(\operatorname{\_2})\lt0))Out[[3,0,−4,3,3],[−2,0,−3,−4,5]]\bigl\lbrack\bigl\lbrack3, 0, -4, 3, 3\bigr\rbrack, \bigl\lbrack-2, 0, -3, -4, 5\bigr\rbrack\bigr\rbrack

Run-length encoding: each run becomes a value and a count

live ↗
InMap(_1⁡↦[First(_1⁡),Length(_1⁡)],Split([a,a,a,b,b,a,a,c,c,c]))\mathrm{Map}(\operatorname{\_1}↦\bigl\lbrack\mathrm{First}(\operatorname{\_1}), \mathrm{Length}(\operatorname{\_1})\bigr\rbrack, \mathrm{Split}(\bigl\lbrack a, a, a, b, b, a, a, c, c, c\bigr\rbrack))Out[[a,3],[b,2],[a,2],[c,3]]\bigl\lbrack\bigl\lbrack a, 3\bigr\rbrack, \bigl\lbrack b, 2\bigr\rbrack, \bigl\lbrack a, 2\bigr\rbrack, \bigl\lbrack c, 3\bigr\rbrack\bigr\rbrack
Properties #

Equal values separated by others stay in separate runs

live ↗
InSplit([a,a,a,b,b,a,a,c,c,c])\mathrm{Split}(\bigl\lbrack a, a, a, b, b, a, a, c, c, c\bigr\rbrack)Out[[a,a,a],[b,b],[a,a],[c,c,c]]\bigl\lbrack\bigl\lbrack a, a, a\bigr\rbrack, \bigl\lbrack b, b\bigr\rbrack, \bigl\lbrack a, a\bigr\rbrack, \bigl\lbrack c, c, c\bigr\rbrack\bigr\rbrack
Neat examples #
live ↗
InNestList(_1⁡↦Flatten(Map(_1⁡↦[Length(_1⁡),First(_1⁡)],Split(_1⁡))),[1],8)\mathrm{NestList}(\operatorname{\_1}↦\mathrm{Flatten}(\mathrm{Map}(\operatorname{\_1}↦\bigl\lbrack\mathrm{Length}(\operatorname{\_1}), \mathrm{First}(\operatorname{\_1})\bigr\rbrack, \mathrm{Split}(\operatorname{\_1}))), \bigl\lbrack1\bigr\rbrack, 8)Out[[1],[1,1],[2,1],[1,2,1,1],[1,1,1,2,2,1],[3,1,2,2,1,1],[1,3,1,1,2,2,2,1],[1,1,1,3,2,1,3,2,1,1],[3,1,1,3,1,2,1,1,1,3,1,2,2,1]]\bigl\lbrack\bigl\lbrack1\bigr\rbrack, \bigl\lbrack1, 1\bigr\rbrack, \bigl\lbrack2, 1\bigr\rbrack, \bigl\lbrack1, 2, 1, 1\bigr\rbrack, \bigl\lbrack1, 1, 1, 2, 2, 1\bigr\rbrack, \bigl\lbrack3, 1, 2, 2, 1, 1\bigr\rbrack, \bigl\lbrack1, 3, 1, 1, 2, 2, 2, 1\bigr\rbrack, \bigl\lbrack1, 1, 1, 3, 2, 1, 3, 2, 1, 1\bigr\rbrack, \bigl\lbrack3, 1, 1, 3, 1, 2, 1, 1, 1, 3, 1, 2, 2, 1\bigr\rbrack\bigr\rbrack
About
Examples16
Checked againstWolfram Language 16 agree
CrosswalkWolfram Language

See also: Gather, SplitBy, Partition