cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use JMP Live to centralize and share reports within groups. Webinar with Q&A April 4, 2pm ET.
Choose Language Hide Translation Bar
View Original Published Thread

Nested Lists

SpannerHead
Level V

I have somehow generated a nested list of columns due to them having been initially grouped.  I would like to remove the nesting to have a continuous list of columns I can act on.

 

Instead of {{:A, :B, :C}, (:D, :E, :F}}, I would like to get to {:A, :B, :C, :D, :E, :F}


Slán



SpannerHead
5 REPLIES 5
mmarchandFSLR
Level IV


Re: Nested Lists

Here's one way, assuming the items inside the outer list are all lists.  If they might not be, you just need to add a little more code to handle it.

 

Names Default to Here( 1 );
this_list = {{:A, :B, :C}, {:D, :E, :F}};
new_list = {};
For Each( {v, i}, this_list,
	For Each( {val, idx}, v,
		Insert Into( new_list, val )
	)
);
SpannerHead
Level V


Re: Nested Lists

Had to tweak this.  Works now.  Thanks.

 

For Each( {val, idx}, this_list,
		Insert Into( new_list, val )
);	

 


Slán



SpannerHead
mmarchandFSLR
Level IV


Re: Nested Lists

Ah, sorry.  I was testing on strings, and I forgot that inserting a list into a list actually inserts the unevaluated items of the list.  If you have any columns that are not inside of a nested list, they will be inserted as missing, for example:

 

Names Default To Here( 1 );
this_list = {{:A, :B, :C}, :D, {:E, :F, :G}};
new_list = {};
For Each( {v, i}, this_list, Insert Into( new_list, v ) );

//{:A, :B, :C, ., :E, :F, :G}

You can solve the issue by using Name Expr():

 

Names Default To Here( 1 );
this_list = {{:A, :B, :C}, :D, {:E, :F, :G}};
new_list = {};
For Each( {v, i}, this_list, Insert Into( new_list, Name Expr( v ) ) );

//{:A, :B, :C, :D, :E, :F, :G}
txnelson
Super User


Re: Nested Lists

You just need to concatenate the individual lists;

Names Default To Here( 1 );
l1 = {{:A, :B, :C}, {:D, :E, :F}};

l2 = l1[1] || l1[2];

I suggest you take the time to read the section of the Scripting Guide on the creation and manipulation of Lists.

Jim
pmroz
Super User


Re: Nested Lists

Building on Jim's solution.  If you have more than two sublists:

Names Default To Here( 1 );
l1 = {{:A, :B, :C}, {:D, :E, :F}, {:G, :H, :I, :J}};
l3 = {};
for (i = 1, i <= nitems(l1), i++,
	insertinto(l3, l1[i]);
);
print(l3);
{:A, :B, :C, :D, :E, :F, :G, :H, :I, :J}