Listas e Tuplas
Listas e tuplas são as principais sequências ordenadas do Python. Listas se destacam quando você precisa de mutabilidade e métodos como sort; tuplas sinalizam registros fixos e permitem hashability quando o conteúdo permite.
Receita
nums = [3, 1, 4, 1, 5]
nums.sort()
unique_sorted = sorted(set(nums))
row = ("ada", 1842)
name, year = row
subset = nums[1:4:2]Quando usar isso:
- Construir coleções ordenadas com
append/pop - Retornar resultados de múltiplos valores fixos de funções
- Fatiar e desempacotar no processamento de dados
- Manter sequências ordenadas com
bisect
Exemplo de Trabalho
import bisect
from typing import NamedTuple
class Event(NamedTuple):
ts: float
kind: str
def top_k(items: list[int], k: int) -> list[int]:
return sorted(items, reverse=True)[:k]
def insert_timestamped(events: list[Event], ts: float, kind: str) -> None:
bisect.insort(events, Event(ts, kind))
def partition(pred, items: list[object]) -> tuple[list[object], list[object]]:
yes, no = [], []
for item in items:
(yes if pred(item) else no).append(item)
return yes, no
if __name__ == "__main__":
timeline: list[Event] = []
insert_timestamped(timeline, 1.0, "start")
insert_timestamped(timeline, 0.5, "warmup")
print(timeline)
print(top_k([4, 1, 7, 3], 2))O que isso demonstra:
NamedTupledá imutabilidade de tupla com campos nomeadosbisect.insortmantém a ordem ordenada para inserçõessortedretorna nova lista sem mutar a original- O retorno de tupla agrupa duas listas relacionadas de
partition
Mergulho Profundo
Como Funciona
- Listas - Arrays dinâmicos; alocam em excesso para
appendamortizado O(1). - Tuplas - Tamanho fixo na criação; menor uso de memória que listas.
- Fatiamento -
start:stop:stepcria cópia rasa de porção da sequência. - Ordenação - Timsort; estável;
key=evita decoração manual. - bisect - Ponto de inserção de busca binária para listas ordenadas.
list vs tuple
| Necessidade | Escolha |
|---|---|
| Mutar, adicionar, ordenar | list |
| Chave de dicionário / membro de conjunto | tuple (se hashable) |
| Pacote de retorno de função | tuple ou NamedTuple |
| Buffer numérico homogêneo | array.array ou numpy |
Notas Python
# cópia vs visualização
a = [1, 2, 3]
b = a[:] # cópia rasa
c = list(a) # o mesmo
# desempacotamento de tupla com *
first, *middle, last = (1, 2, 3, 4)Armadilhas
- Cópia rasa de lista aninhada - Listas internas ainda compartilhadas. Correção:
copy.deepcopy. - Ordenar tipos mistos -
TypeErrorno Python 3. Correção: Normalizar para valores comparáveis ou usarkey. - bisect em lista não ordenada - Posição de inserção incorreta silenciosamente. Correção: Manter invariante documentado ou ordenar primeiro.
+=cria nova tupla -t += (1,)rebinda; não muta a tupla (imutabilidade). Correção: Esperado - atribuir nova tupla.- Lista grande como membro de conjunto - Listas não são hashable. Correção: Converter para tupla ou usar dicionário com chave por id.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
deque | Fila/pilha em ambas as extremidades | Precisa ordenar/acessar aleatoriamente por índice com frequência |
array.array | Tipos numéricos C compactos | Tipos de objetos mistos |
numpy.ndarray | Numéricos vetorizados | Listas de scripts pequenos |
dataclass | Registros mutáveis com métodos | Precisa de registro hashable/imutável |
FAQs
lista ou tupla para valores de retorno?
Tupla é convencional para retornos de formato fixo (valor, erro). Use NamedTuple quando os campos precisam de nomes.
sort vs sorted?
list.sort() muta no local retornando None. sorted(iterable) retorna nova lista - funciona em qualquer iterável.
Como funciona a indexação negativa?
-1 é o último elemento. O slice [:-1] exclui o último item.
Quando bisect vale a pena?
Inserções frequentes em uma lista majoritariamente ordenada onde a varredura linear prejudicaria - tamanhos modestos ainda funcionam bem com lista simples.
Tuplas podem conter listas?
Sim, mas então a tupla não é hashable. Não pode ser usada como chave de dicionário.
Qual a diferença entre list.extend e +?
extend muta no local. + cria nova lista - mais lento para sequências grandes.
Como remover enquanto itero?
Itere uma cópia ou construa nova lista - mutar durante a iteração pula elementos.
List comprehensions são sempre melhores?
Frequentemente para map/filter. Loop simples é mais claro para ramificações complexas ou efeitos colaterais.
O que é key= em sort?
Calcula a chave de ordenação uma vez por elemento: sorted(users, key=lambda u: u.name.lower()).
Como inverter no local?
items.reverse() ou items[::-1] para cópia.
Relacionados
- Imutabilidade e Hashability - tuplas hashable
- Dicionários - quando listas se tornam valores
- heapq & Filas de Prioridade - ordenação por prioridade
- Comprehensions & Generator Expressions - construindo listas
Versões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.