Suppose I wanted to write down a list of $p^2$, for $p$ a prime between $1$ and $20$. I would expect

Table[If[PrimeQ[k], k^2, Sequence[]], {k, 1, 20}]

to work. In fact, this produces,

{Null, 4, 9, Null, 25, Null, 49, Null, Null, Null, 121, Null, 169, Null, Null, Null, 289, Null, 361, Null}

Why does this happen, and is there a variant which does work the way I expect?

Of course, I can just do

Map[(#^2) &, Select[Range[20], PrimeQ]]

I don't have a real reason to avoid this, but it feels less readable to me.

UPDATE: Given the answers I'm seeing, I should point out that this is meant to be a toy example and the actual code involves boolean functions much messier than PrimeQ[], for which there is no analogue of Prime[] available. But Szabolcs answer is exactly what I was looking for, thanks!

  • 2
    $\begingroup$ Just in case you weren't already aware of the enhanced abilities of Table[]: Table[k^2, {k, Select[Range[20], PrimeQ]}] also works well. $\endgroup$ Commented Nov 13, 2012 at 22:22

3 Answers 3


The short answer is that Sequence[] expands already inside the If[ ... ] because If does not have the SequenceHold attribute. If[False, <<something>>] (i.e. missing third argument) will evaluate to Null.

Just use

Table[If[PrimeQ[k], k^2, Unevaluated@Sequence[]], {k, 1, 20}]
  • 4
    $\begingroup$ ...or use the "vanishing function" variation: Table[If[PrimeQ[k], k^2, ## &[]], {k, 20}] $\endgroup$ Commented Nov 13, 2012 at 22:18
  • 1
    $\begingroup$ @J.M. the vanishing function is very useful in specific circumstances but I personally find it less transparent than the alternatives. Also, it comes with a certain amount of overhead--here, for example, it's almost 50% slower than using Unevaluated@Sequence[]. $\endgroup$ Commented Nov 14, 2012 at 14:15

Szabolcs explained the why, just an example of something readable you can use instead:

Table[Prime[n]^2, {n, PrimePi[20]}]

Is this more readable?

Select[Prime[Range[20]], # < 20 &]^2

Or probably even better would be

  • $\begingroup$ Or, perhaps, myfn2[x_?PrimeQ] := x^2; myfn2[x_] := Sequence[]; Table[myfn2@k, {k, 1, 20}] $\endgroup$
    – user1066
    Commented Nov 14, 2012 at 0:33

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