Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Possible Duplicate:
How to avoid returning a Null if there is no “else” condition in an If contruct

I have several situations where I need to conditionally add an element to a list, at various locations in the list. When the condition is not met, I want to add nothing at all, but the only techniques I can come up with result in the insertion of some element. For example

{1, 2, If[False, 3, Null], 4, 5, If[False, 6, {}]} 


{1, 2, Null, 4, 5, {}}

which is in many contexts thus contains elements that are invalid, e.g., here for functions that expect integers.

I understand that I could use Insert, but that quickly results in hard to parse code, where the positions of the conditional elements no longer corresponds to their position in the list construction code

If[True, Insert[#, 6, 6], #] &@If[True, Insert[#, 3, 3], #] &@{1, 2, 4, 5}

and which, in any case, produces errors without additional length checks:

If[True, Insert[#, 6, 6], #] &@If[False, Insert[#, 3, 3], #] &@{1, 2, 4, 5}

Insert::ins: "Cannot insert at position {6} in {1,2,4,5}"

Is there a form that will allow me to place conditional insertions of items in lists at the position where those insertions are to be made within the original list?

share|improve this question

marked as duplicate by Mr.Wizard Dec 12 '12 at 19:16

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

Try {1, 2, If[False, 3, Unevaluated@Sequence[]], 4, 5} – sebhofer Nov 3 '12 at 19:08
up vote 14 down vote accepted

As @sebhofer suggested, you seem to be looking for Sequence,

{1, 2, If[False, 3, Unevaluated@Sequence[]], 4, 5}

A shorter verision that @Mr.Wizard likes using is

{1, 2, If[False, 3, ## &[]], 4, 5}

Both return what you want

{1, 2, 4, 5}

In any case, there are probably more efficient ways of accomplish this that are also easy to parse, so I suggest you give us an example and perhaps we can come up with better solutions

share|improve this answer

This is the more normal approach:

DeleteCases[{1, 2, If[False, 3], 4, 5, If[False, 6]}, Null]

{1, 2, 4, 5}

share|improve this answer

You can create a pick list of True/False values for each element based on your selection function and then use Pick.

include = IncludeElement/@myData

{True, True, False, True, True, False}

Pick[Range@6, include]

{1, 2, 4, 5}

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.