MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: position lists

  • To: mathgroup at smc.vnet.net
  • Subject: [mg68720] Re: position lists
  • From: dimmechan at yahoo.com
  • Date: Thu, 17 Aug 2006 04:18:27 -0400 (EDT)
  • References: <ebujvu$6lu$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Dear Igor,

You can achieve what you want with a little modification of what you
thought (copy and paste the inputs to your notebook)

In[1]:=
Clear["Global*"]

In[2]:=
a={1,1,2,2,1,3,3,3,4,4,7};

In[3]:=
Map[Position[a,#]&,Range[Max[a]]]
Out[3]=
{{{1},{2},{5}},{{3},{4}},{{6},{7},{8}},{{9},{10}},{},{},{{11}}}

In[4]:=
Map[Flatten,%]
Out[4]=
{{1,2,5},{3,4},{6,7,8},{9,10},{},{},{11}}

In[5]:=
%//.{x___,{},y___}\[Rule]{x,{0},y}
Out[5]=
{{1,2,5},{3,4},{6,7,8},{9,10},{0},{0},{11}}

As an one-liner function:

In[6]:=
f[lst_List] := Map[Flatten, Map[Position[lst, #] &, Range[Max[lst]]]]
//. \
                            {x___, {}, y___} -> {x, {0}, y}

In[7]:=
f[{1,1,2,2,1,3,3,3,4,4,7}]
Out[7]=
{{1,2,5},{3,4},{6,7,8},{9,10},{0},{0},{11}}

Another function that do what you want is the following:

In[8]:=
g[lst_List]:=Module[{c},c=
  Map[Flatten,Map[Position[
      lst,#]&, Range[Max[lst]]]];ReplacePart[c,{0},Position[c,{}]]]

In[9]:=
g[a]
Out[9]=
{{1,2,5},{3,4},{6,7,8},{9,10},{0},{0},{11}}


However, both functions need considerable time for bigger lists.

In[10]:=
list = Table[Random[Integer, {0, 10000}], {10000}];

In[20]:=
Timing[f[list]][[1]]
Out[20]=
24.718 Second

In[28]:=
Timing[g[list]][[1]]
Out[28]=
27.719 Second

Certainly, there are other function that achieve your goal in less
time.
Anyway, I hope you will find the above, helpful.

Regards,

Jim


  • Prev by Date: Re: No output or In[n] prompt appearing
  • Next by Date: Re: namespace collision [bug]
  • Previous by thread: Re: position lists
  • Next by thread: Re: position lists