Mathematica Asked by Nasser on January 29, 2021
Given
lst = {a, b, c, d}
I’d like to generate
{{a}, {a, b}, {a, b, c}, {a, b, c, d}}
but using built-in functions only, such as Subsets
, Partitions
, Tuples
, Permutations
or any other such command you can choose. But it has to be done only using built-in commands. You can use a pure function, if inside a built-in command, i.e. part of the command arguments. That is OK.
It is of course trivial to do this by direct coding. One way can be
lst[[1 ;; #]] & /@ Range[Length[lst]]
(* {{a}, {a, b}, {a, b, c}, {a, b, c, d}} *)
or even
LowerTriangularize[Table[lst, {i, Length[lst]}]] /. 0 -> Sequence @@ {}
(* {{a}, {a, b}, {a, b, c}, {a, b, c, d}} *)
But I have the feeling there is a command to do this more directly as it looks like a common operation, but my limited search could not find one so far.
Sorry in advance if this was asked before. Searching is hard for such general questions.
FromLetterNumber@Range@Range[4]
{{a},{a,b},{a,b,c},{a,b,c,d}}
Edit
On looking at this answer by Carl Woll (see also part-2 of the answer by image_doctor below).
And see also the comment by kglr to this answer by rcollyer.
FoldList[Flatten[{##}] &, Nothing, {a, b, c, d}]
{{a}, {a, b}, {a, b, c}, {a, b, c, d}}
Answered by user1066 on January 29, 2021
This is not a built-in function to do it but it fits the criteria of only using buil-in functions. It avoids using patterns, mapping constructs and such things.
Maybe in the future ListCorrelate can accepts functions instead of heads (e.g. applying Plus to a list by default). I think that would make it more useful (but I am a beginner Mathematica user, so who am I to hold such opinions).
lst = {a, b, c, d};
DeleteCases[
ListCorrelate[lst, ConstantArray[1, Length@lst], 1, 0, Times,
List], 0, {2}]
Answered by C. E. on January 29, 2021
A joke solution:
Outer[Take, {{a, b, c, d, e}}, Range[5], 1] // First
Answered by J. M.'s ennui on January 29, 2021
A variant using Partition:
First[Partition[list,#]]& /@ Range@Length@list
Answered by Stefan on January 29, 2021
What about Accumulate
:
Function[lst, {{lst[[1]]}}~Join~Rest[Accumulate[lst] /. Plus -> List]]@{a, b, c, d, e}
Unfortunately it doesn't accept a custom function other than Plus
and will not work for numerical list...
Answered by Silvia on January 29, 2021
I am not sure this wins any speed contests, but it is a purely functional solution:
FoldList[#1~Join~{#2} &, {First@#}, Rest@#]& @ {a, b, c, d, e}
(* {{a}, {a, b}, {a, b, c}, {a, b, c, d}, {a, b, c, d, e}} *)
Answered by rcollyer on January 29, 2021
lst={a,b,c,d};
ReplaceList[lst,{x__, ___} :> {x}]
Speaking of "common operation":
Table[lst[[;; i]], {i, Length@lst}]
Answered by kglr on January 29, 2021
A variant using Take
.
list~Take~# & /@ Range@Length@list
{{a}, {a, b}, {a, b, c}, {a, b, c, d}}
One using NestList
:
NestList[Most, list, Length@list - 1]
{{a, b, c, d}, {a, b, c}, {a, b}, {a}}
Answered by image_doctor on January 29, 2021
Subsets
takes an optional 3rd argument as Subsets[list, {n}, k]
that gives you the k
th sublist of length n
. Since your sublists are in sequence, you'll always need k = 1
. You can then use this as:
MapIndexed[First@Subsets[list, #2, 1] &, list]
(* {{a}, {a, b}, {a, b, c}, {a, b, c, d}} *)
Another alternative would be:
Reverse@Most@NestWhileList[Most, list, # != {} &]
Answered by rm -rf on January 29, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP