SUMMARY: How {{a,b,c},{1,2,3,4,5,6,7}}-->{{a,1},{b,2},{c,3},{a,4},...,{a,7},{b,1},...}?
- To: mathgroup at smc.vnet.net
- Subject: [mg14317] SUMMARY: How {{a,b,c},{1,2,3,4,5,6,7}}-->{{a,1},{b,2},{c,3},{a,4},...,{a,7},{b,1},...}?
- From: Michael Kubovy <mk9y at virginia.edu>
- Date: Tue, 13 Oct 1998 01:21:30 -0400
- Organization: University of Virginia
- Sender: owner-wri-mathgroup at wolfram.com
Dear Friends, I asked how to go from (e.g.) {{a,b,c},{1,2,3,4,5,6,7}} to {{a,1},{b,2},{c,3},{a,4},...,{a,7},{b,1},...} ? A number of people offered solutions. They vary in style and technique. I thought the comparison might be of general interest. ********* (1) Bruce.Fast at Colorado.EDU mix[x_List] := Module[ {m=Map[Length,x],mx}, mx=Max[m]; Table[x[[j,1+Mod[i-1,m[[j]]]]], {i,mx}, {j,Length[m]}] ] In[7]:= mix[ {{a,b},{1,2,3}} ] Out[7]= {{a, 1}, {b, 2}, {a, 3}} In[8]:= mix[ {{a,b}, {1,2,3}, {v,w,x,y,z}} ] Out[8]= {{a, 1, v}, {b, 2, w}, {a, 3, x}, {b, 1, y}, {a, 2, z}} ********* (2) Levent Kitis <lk3a at esmeralda.mech.virginia.edu> Tuples[list_List] := Module[{m, n}, {m, n} = Length /@ list; Which[ m < n, Transpose[{Take[Join @@ Table[list[[1]], {Ceiling[n/m]}], n], list[[2]]}], m > n, Transpose[{list[[1]], Take[Join @@ Table[list[[2]], {Ceiling[m/n]}], m]}], m == n, Transpose[list] ] ] Examples: In[2]:= x = {{a, b}, {1, 2, 3, 4}}; In[3]:= Tuples[x] Out[3]= {{a, 1}, {b, 2}, {a, 3}, {b, 4}} In[4]:= x = {{1, 2, 4}, {a, b}}; In[5]:= Tuples[x] Out[5]= {{1, a}, {2, b}, {4, a}} In[6]:= x = {{1, 2, 4}, {1, 2, 4}}; In[7]:= Tuples[x] Out[7]= {{1, 1}, {2, 2}, {4, 4}} In[8]:= x = {{1, 2, 3, 4, 5, 5, 6, 6, 7, 8}, {a, b, c}}; In[9]:= Tuples[x] Out[9]= {{1, a}, {2, b}, {3, c}, {4, a}, {5, b}, {5, c}, {6, a}, {6, b}, {7, c}, {8, a}} ********* (3) Selwyn Hollis <shollis at peachnet.campus.mci.net> pairup[{a_List,b_List}]:= Module[{aa=a}, While[Length[aa]<Length[b], aa=Join[aa,a]]; aa=Delete[aa,Table[{i},{i, Length[b]+1, Length[aa]}]]; Transpose[{aa,b}]] For example, pairup[{{a,b,c},{1,2,3,4,5,6,7,8}}] gives {{a,1},{b,2},{c,3},{a,4},{b,5},{c,6},{a,7},{b,8}} ********* (4) Hans Staugaard <hans.staugaard at get2net.dk> First I define a function pad: pad[v:{__},n_Integer]:= Take[Flatten[Table[v,{Ceiling[n/Length[v]]}]],n] /; n>Length[v] pad[v:{__},n_Integer]:= v /; n=Length[v] and then maketuples[m:{{__}..}]:= With[{n=Max[Length[#]&/@m]},Transpose[pad[#,n]&/@m]] this function should do the job, and will also work on things like {{a,b},{1,2,3},{A,B,C,D}} yielding {{a,1,A},{b,2,B},{a,3,C},{b,1,D}} ********* (5) "Ersek, Ted R" <ErsekTR at navair.navy.mil> Let me assume you want to cycle through the first list until it's as long as the second list. Consider 'data' below. In[1]:= data={{a,b,c,d,e,f},{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,2 2,23}}; Using the lines below you can make a new list by cycling through the first list the right number of times. The you can use Transpose. In[2]:= l1=Table[lst, {Floor[23/Length[lst]]} ] Out[2]= {{a,b,c,d,e,f},{a,b,c,d,e,f},{a,b,c,d,e,f}} In[3]:= l2=Take[lst, {1,Mod[23,Length[lst]]} ] Out[3]= {a,b,c,d,e} In[4]:= l3=Flatten at Join[l1,l2] Out[4]= {a,b,c,d,e,f,a,b,c,d,e,f,a,b,c,d,e,f,a,b,c,d,e} In[5]:= Transpose[{l3,Part[data,2]}] Out[5]= {{a,1},{b,2},{c,3},{d,4},{e,5},{f,6},{a,7},{b,8},{c,9},{d,10},{e,11},{f,12}, {a,13},{b,14},{c,15},{d,16},{e,17},{f,18},{a,19},{b,20},{c,21},{d,22},{e,23} } Thanks to all, |\ /| / Michael Kubovy, Professor of Psychology, Dept of Psychology | \/ | / Univ of Virginia, Gilmer Hall, Charlottesville, VA 22903-2477 | |/\ office (B011): 804-982-4729, lab (B019): -4751, fax: -4766 | | \ HTTP://www.virginia.edu/~mklab/