В качестве альтернативы, вы можете сделать что-то вроде
With[{tal = Tally[Characters["2723198931"]]},
Flatten@Pick[tal, tal[[All, 1]], #] & /@ key]
Вы всегда считаете символы в строке? Если это так, может быть более эффективным считать символы непосредственно, а не преобразовывать их в список символов в первую очередь. Рассмотрим для примера
str = StringJoin[RandomChoice[CharacterRange["0", "9"], 1000]];
key = {"3", "1", "2", "9"};
({#, StringCount[str, #]} & /@ key) // Timing
(* output: {0.000121, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)
With[{tal = Tally[Characters[str]]},
Flatten@Pick[tal, tal[[All, 1]], #] & /@ key] // Timing
(* output: {0.000567, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)