I think a solution based on pattern matching will be much faster than ones based on `Element` (which is more mathematical in usage) or pattern tests or anythign else that forces evaluation, since we can bypass the main evaluator. ClearAll@realQ SetAttributes[realQ, Listable] realQ[_Real | _Integer | _Rational] := True realQ[_Symbol?NumericQ] := True realQ[Complex[_, 0.]] := True realQ[_] := False realQ[{"text", 0, 3.0, 1/2, I}] (* {False, True, True, True, False} *)