Re: Flattening
- To: mathgroup at yoda.physics.unc.edu
- Subject: Re: Flattening
- From: Cetin Cetinkaya <cetin%acm4 at yoda.physics.unc.edu>
- Date: Fri, 3 Apr 1992 13:32:48 -0600
gaylord at ux1.cso.uiuc.edu writes: >Subject: elegance vs. 'quick and dirty': a Mathematica expression beauty contest >a recent discussion of Flattening dealt with going from startlist = {{a,a,a},{a,a},{{b,b},{b,b,b}},{a,a,a,a},{{b,b},{b}}} >to finallist = {{a,a,a},{a,a},{b,b},{b,b,b},{a,a,a,a},{b,b},{b}} >Three solutions have been proposed: >#1 >finallist = FixedPoint[ Replace[#,{A___,List[X___List],B___} :> {A,X,B}]&, startlist] >Let $A be an unused or local symbol >finallist = Flatten[List @@ ( startlist /. List[X___List] :> $A[X] /. {List->$A,$A->List} ) ] /. $A->List >#2 >f[x_List] := > Apply[Join,Map[(If[Head[First[#]] === List, #, {#}] &), x]] #>3 >f[{x__}] := Sequence[x] /; Not[ And @@ AtomQ /@ {x} ] >f[{x__}] := {x} >f /@ startlist >========================== >#2 and #3 have been proposed by their authors as being 'quick and dirty'. I >don't agree at all with the authors. I rank these expressions in terms of >'elegance in the order >#2, #3, #1 But I think the true winner is number 1 because it is the only one which works! Let me explain what I mean: In[14]:= f[x_List] := Apply[Join,Map[(If[Head[First[#]] === List, #, {#}] &), x]] 0. 1317.904 KByte In[15]:= f[{{{{a,b},{c,d}}}}] 0. 1318.38 KByte Out[15]= {{{a, b}, {c, d}}} Thus, number 2 does not work for more general lists. Only "first order" lists can be handled using it. In[16]:= f[{x__}] := Sequence[x] /; Not[ And @@ AtomQ /@ {x} ] 0. 1319.276 KByte In[17]:= f[{x__}] := {x} 0. 1319.988 KByte In[18]:= f/@{{{{a,b},{c,d}}}} 0. 1320.492 KByte Out[18]= {{{a, b}, {c, d}}} And this shows that number 3 does not work,either. However, In[20]:= FixedPoint[ Replace[#,{A___,List[X___List],B___} :> {A,X,B}]&, {{{{{{a,b},{c,d}}}}}}] 0.0166667 Second 1322.456 KByte Out[20]= {{a, b}, {c, d}} Therefore, the only working one and the winner is number 1. ccetinkaya