Análise: Caça aos Emojis 🕵️‍♂️

Vamos dar uma olhada na solução enviada:

import re

def num_emojis(arg):
return sum([re.match("^[:;][~-]?[)D]$",i) is not None for i in arg])


Funciona? Sim. Deixar isso em produção? Não.

1️⃣ Pecado da alocação
Os colchetes dentro de sum([ ... ]) significam que o Python primeiro criará na memória uma lista completa de True/False do tamanho do array original, e só depois a somará. Se a entrada for um log de 10 milhões de linhas, sua memória vai embora.
Removemos os colchetes — obtemos uma expressão geradora. Memória O(1) em vez de O(n).

2️⃣ Verificações redundantes
A construção match(...) is not None tem seu lugar, mas em Python é comum usar a "veracidade" (truthiness) dos objetos. Além disso, precisamos apenas contar o número de correspondências. Abordagem idiomática: sum(1 for ... if ...)

3️⃣ Recompilação
Chamar re.match dentro do loop toda vez força o Python a acessar o cache de regex. Se houver muitas strings, o padrão deve ser compilado uma vez antes do loop.

Jogamos fora o lixo e escrevemos assim:
import re

# Compilação no topo
SMILEY_PATTERN = re.compile(r"^[:;][~-]?[)D]$")

def count_smileys(faces: list[str]) -> int:
return sum(1 for face in faces if SMILEY_PATTERN.match(face))


☝️Mas o principal problema dessa solução não é a sintaxe.
Por que precisamos de regex aqui?

Vamos calcular: temos 2 opções de olhos, 3 opções de nariz (incluindo sua ausência) e 2 opções de boca.
Existem exatamente 12 emojis válidos. Como escreveu @archimage_wiz, em vez de executar uma máquina de estados pesada de expressões regulares em cada linha, basta verificar se a string está em um conjunto (set) pré-preparado.

A busca em um conjunto é feita em tempo constante O(1) (é uma tabela hash).

Solução de uma pessoa sã:
from typing import List

VALID_SMILES = {
':)', ';)', ':-)', ';-)', ':~)', ';~)',
':D', ';D', ':-D', ';-D', ':~D', ';~D'
}

def num_emojis_pro(arr: List[str]) -> int:
return sum(s in VALID_SMILES for s in arr)


Este código não requer importação do módulo re, é óbvio para qualquer júnior à primeira vista, e em grandes volumes de dados ele destruirá as regex em velocidade de execução.

Ferramentas complexas são legais. Mas saber usar as simples já é uma habilidade.

#algosobes