How to generate Intervals from a given list?

If I have a list

list={3,7,4,5,1}


how to get the List of Intervals /Ranges

result = {{1,3},{3,4},{4,5},{5,7}}


Maybe

Partition[Sort@list, 2, 1]


giving

{{1, 3}, {3, 4}, {4, 5}, {5, 7}}

Update

BlockMap[#&, Sort[list], 2,1]

(* {{1,3},{3,4},{4,5},{5,7}} *)

• Beat me to it - 7 secs! Deleting mine, and +1. Commented Jan 21, 2012 at 9:30

Tom's answer is canonical, but you could also use:

With[{s = Sort[list]}, Transpose[{Most[s], Rest[s]}]]


which seems to be marginally faster for large lists. (In which case most of the time is spent sorting.)

• Alternatively: Composition[Transpose, Through, {Most, Rest}, Sort][list]. Commented Jan 22, 2012 at 4:26

Another way using Subsets, Sort and the third argument of GroupBy:

list = {3, 7, 4, 5, 1};

Values@GroupBy[Subsets[Sort@#, {2}], First, First] &@list

(*{{1, 3}, {3, 4}, {4, 5}, {5, 7}}*)

list = {3, 7, 4, 5, 1};

Query[{Most, Rest} /* Transpose] @ Sort[list]


{{1, 3}, {3, 4}, {4, 5}, {5, 7}}