Python

Guia Completo de Listas, Tuplas, Sets e Dicionários em Python na Prática

17 min de leitura

Guia Completo de Listas, Tuplas, Sets e Dicionários em Python na Prática

Estruturas de Dados em Python: Listas, Tuplas, Sets e Dicionários Python oferece quatro estruturas de dados fundamentais que você usará constantemente em seu dia a dia como programador. Cada uma delas foi projetada para resolver problemas específicos, e entender suas características, limitações e casos de uso é essencial para escrever código eficiente e legível. Neste artigo, vamos explorar cada uma dessas estruturas de forma prática, focando em aplicações reais que você encontrará em projetos profissionais. A escolha da estrutura correta não é apenas uma questão de estilo — ela impacta diretamente na performance, legibilidade e manutenibilidade do seu código. Uma decisão incorreta pode transformar um algoritmo linear em exponencial, ou tornar seu código tão confuso que ninguém conseguirá manutenção no futuro. Listas: A Estrutura Versátil e Mutável O que é uma Lista? Uma lista em Python é uma coleção ordenada, mutável e que permite elementos duplicados. Quando dizemos "mutável", significa que você pode adicionar, remover ou modificar elementos após a

<h2>Estruturas de Dados em Python: Listas, Tuplas, Sets e Dicionários</h2>

<p>Python oferece quatro estruturas de dados fundamentais que você usará constantemente em seu dia a dia como programador. Cada uma delas foi projetada para resolver problemas específicos, e entender suas características, limitações e casos de uso é essencial para escrever código eficiente e legível. Neste artigo, vamos explorar cada uma dessas estruturas de forma prática, focando em aplicações reais que você encontrará em projetos profissionais.</p>

<p>A escolha da estrutura correta não é apenas uma questão de estilo — ela impacta diretamente na performance, legibilidade e manutenibilidade do seu código. Uma decisão incorreta pode transformar um algoritmo linear em exponencial, ou tornar seu código tão confuso que ninguém conseguirá manutenção no futuro.</p>

<h2>Listas: A Estrutura Versátil e Mutável</h2>

<h3>O que é uma Lista?</h3>

<p>Uma lista em Python é uma coleção ordenada, mutável e que permite elementos duplicados. Quando dizemos &quot;mutável&quot;, significa que você pode adicionar, remover ou modificar elementos após a criação. A ordem dos elementos é preservada, o que torna as listas ideais quando a sequência importa.</p>

<p>Listas são criadas com colchetes e separadas por vírgulas. Internamente, Python armazena referências aos objetos, não os objetos em si, o que significa que você pode misturar tipos diferentes sem problemas:</p>

<pre><code class="language-python"># Criando listas

numeros = [1, 2, 3, 4, 5]

nomes = [&quot;Alice&quot;, &quot;Bob&quot;, &quot;Carlos&quot;]

misto = [1, &quot;Python&quot;, 3.14, True, None]

vazia = []

Acessando elementos (indexação começa em 0)

print(numeros[0]) # 1

print(nomes[-1]) # &quot;Carlos&quot; (último elemento)

print(numeros[1:3]) # [2, 3] (slice)

Modificando elementos

numeros[0] = 10

print(numeros) # [10, 2, 3, 4, 5]</code></pre>

<h3>Operações Comuns com Listas</h3>

<p>As operações em listas são ferramentas do dia a dia. Você vai usar <code>append()</code>, <code>extend()</code>, <code>pop()</code>, <code>remove()</code> e <code>insert()</code> constantemente. Cada uma tem sua nuance importante:</p>

<pre><code class="language-python">frutas = [&quot;maçã&quot;, &quot;banana&quot;]

append() — adiciona um elemento no final

frutas.append(&quot;laranja&quot;)

print(frutas) # [&quot;maçã&quot;, &quot;banana&quot;, &quot;laranja&quot;]

extend() — adiciona múltiplos elementos

frutas.extend([&quot;uva&quot;, &quot;morango&quot;])

print(frutas) # [&quot;maçã&quot;, &quot;banana&quot;, &quot;laranja&quot;, &quot;uva&quot;, &quot;morango&quot;]

insert() — adiciona em posição específica

frutas.insert(1, &quot;abacaxi&quot;)

print(frutas) # [&quot;maçã&quot;, &quot;abacaxi&quot;, &quot;banana&quot;, &quot;laranja&quot;, &quot;uva&quot;, &quot;morango&quot;]

remove() — remove primeira ocorrência do valor

frutas.remove(&quot;banana&quot;)

print(frutas) # [&quot;maçã&quot;, &quot;abacaxi&quot;, &quot;laranja&quot;, &quot;uva&quot;, &quot;morango&quot;]

pop() — remove por índice e retorna o valor

ultima = frutas.pop()

print(ultima) # &quot;morango&quot;

print(frutas) # [&quot;maçã&quot;, &quot;abacaxi&quot;, &quot;laranja&quot;, &quot;uva&quot;]

sort() — ordena IN-PLACE (modifica a lista original)

numeros = [3, 1, 4, 1, 5]

numeros.sort()

print(numeros) # [1, 1, 3, 4, 5]

sorted() — cria uma nova lista ordenada (não modifica a original)

numeros = [3, 1, 4, 1, 5]

ordenados = sorted(numeros)

print(numeros) # [3, 1, 4, 1, 5]

print(ordenados) # [1, 1, 3, 4, 5]</code></pre>

<h3>Iteração e Compreensão de Lista</h3>

<p>Trabalhar com listas frequentemente envolve processar cada elemento. List comprehension é uma sintaxe Python poderosa que torna isso elegante:</p>

<pre><code class="language-python"># Iteração tradicional

numeros = [1, 2, 3, 4, 5]

pares = []

for num in numeros:

if num % 2 == 0:

pares.append(num)

print(pares) # [2, 4]

List comprehension — mais pythônico e rápido

pares = [num for num in numeros if num % 2 == 0]

print(pares) # [2, 4]

Transformando elementos

quadrados = [num ** 2 for num in numeros]

print(quadrados) # [1, 4, 9, 16, 25]

Com múltiplas condições

resultado = [num for num in numeros if num &gt; 2 if num % 2 == 0]

print(resultado) # [4]

Caso de uso real: processar dados de API

dados_api = [

{&quot;nome&quot;: &quot;Alice&quot;, &quot;idade&quot;: 25},

{&quot;nome&quot;: &quot;Bob&quot;, &quot;idade&quot;: 30},

{&quot;nome&quot;: &quot;Carlos&quot;, &quot;idade&quot;: 22}

]

nomes_maiores = [d[&quot;nome&quot;] for d in dados_api if d[&quot;idade&quot;] &gt;= 25]

print(nomes_maiores) # [&quot;Alice&quot;, &quot;Bob&quot;]</code></pre>

<h2>Tuplas: Imutáveis e Eficientes</h2>

<h3>Entendendo Tuplas</h3>

<p>Uma tupla é uma sequência imutável. Uma vez criada, você não pode adicionar, remover ou modificar seus elementos. Isso pode parecer uma limitação, mas é exatamente a razão pela qual tuplas existem: quando você quer garantir que nenhum código acidentalmente modifique seus dados.</p>

<p>Tuplas são criadas com parênteses (que são opcionais em muitos casos) e têm performance ligeiramente melhor do que listas porque o Python pode otimizá-las:</p>

<pre><code class="language-python"># Criando tuplas

coordenadas = (10, 20)

ponto_3d = (1, 2, 3)

uma_coisa = (42,) # IMPORTANTE: vírgula necessária para tupla com um elemento

vazia = ()

Acessando elementos (igual às listas)

print(coordenadas[0]) # 10

print(ponto_3d[-1]) # 3

print(coordenadas[0:1]) # (10,)

Tentando modificar — vai dar erro

coordenadas[0] = 15 # TypeError: &#039;tuple&#039; object does not support item assignment</code></pre>

<h3>Quando Usar Tuplas</h3>

<p>Tuplas são frequentemente usadas como chaves em dicionários (listas não podem ser usadas), como argumentos de funções, ou quando você quer garantir que dados não sejam modificados acidentalmente:</p>

<pre><code class="language-python"># Tuplas como chaves de dicionário

mapa_localizacoes = {

(40.7128, 74.0060): &quot;Nova York&quot;,

(51.5074, 0.1278): &quot;Londres&quot;,

(48.8566, 2.3522): &quot;Paris&quot;

}

print(mapa_localizacoes[(40.7128, 74.0060)]) # Nova York

Desempacotamento de tuplas

x, y = coordenadas

print(x, y) # 10 20

Múltiplos retornos de função (implicitamente retornam tuplas)

def buscar_usuario(id):

Simulando banco de dados

return (1, &quot;Alice&quot;, &quot;alice@email.com&quot;)

id_user, nome, email = buscar_usuario(1)

print(nome) # Alice

Iteração sobre tupla

for valor in ponto_3d:

print(valor) # 1, 2, 3 (cada um em uma linha)</code></pre>

<h3>Operações com Tuplas</h3>

<p>Tuplas suportam algumas operações, mas não as que modificam a sequência:</p>

<pre><code class="language-python">tupla1 = (1, 2, 3)

tupla2 = (4, 5, 6)

Concatenação — cria uma nova tupla

combinada = tupla1 + tupla2

print(combinada) # (1, 2, 3, 4, 5, 6)

Repetição

repetida = (1, 2) * 3

print(repetida) # (1, 2, 1, 2, 1, 2)

Contagem de elementos

tupla_com_repeticoes = (1, 2, 2, 3, 2, 4)

print(tupla_com_repeticoes.count(2)) # 3

Índice da primeira ocorrência

print(tupla_com_repeticoes.index(3)) # 3

Comprimento

print(len(tupla_com_repeticoes)) # 6</code></pre>

<h2>Sets: Unicidade e Operações Matemáticas</h2>

<h3>O Que é um Set?</h3>

<p>Um set (conjunto) é uma coleção desordenada de elementos únicos. Não há duplicatas em um set — se você tentar adicionar um elemento que já existe, nada acontece. Sets são mutáveis, mas como são desordenados, você não pode acessar elementos por índice. Em compensação, sets são extremamente rápidos para verificar se um elemento existe.</p>

<p>Sets são criados com chaves <code>{}</code> (cuidado: <code>{}</code> vazio é um dicionário, não um set) ou com a função <code>set()</code>:</p>

<pre><code class="language-python"># Criando sets

numeros = {1, 2, 3, 4, 5}

cores = {&quot;vermelho&quot;, &quot;azul&quot;, &quot;verde&quot;}

vazio = set() # Correto: set() não {}

Removendo duplicatas automaticamente

valores = [1, 2, 2, 3, 3, 3, 4]

unicos = set(valores)

print(unicos) # {1, 2, 3, 4}

Não há índice em sets

print(numeros[0]) # TypeError

Verificar existência — muito rápido

if 3 in numeros:

print(&quot;3 existe no set&quot;)

Para sets grandes (milhões de elementos),

essa verificação é O(1) enquanto em listas seria O(n)

grande_set = set(range(1000000))

print(1000000 in grande_set) # False (muito rápido!)</code></pre>

<h3>Operações Matemáticas com Sets</h3>

<p>Sets implementam operações de álgebra de conjuntos. Se você estudou teoria dos conjuntos na matemática, isso vai parecer familiar:</p>

<pre><code class="language-python">a = {1, 2, 3, 4}

b = {3, 4, 5, 6}

União — todos os elementos de ambos

uniao = a | b # ou a.union(b)

print(uniao) # {1, 2, 3, 4, 5, 6}

Interseção — elementos em comum

interseccao = a &amp; b # ou a.intersection(b)

print(interseccao) # {3, 4}

Diferença — elementos em a mas não em b

diferenca = a - b # ou a.difference(b)

print(diferenca) # {1, 2}

Diferença simétrica — elementos em um ou outro, mas não em ambos

simetrica = a ^ b # ou a.symmetric_difference(b)

print(simetrica) # {1, 2, 5, 6}

Caso de uso prático: encontrar produtos em comum entre lojas

loja_a = {&quot;notebook&quot;, &quot;mouse&quot;, &quot;teclado&quot;, &quot;monitor&quot;}

loja_b = {&quot;notebook&quot;, &quot;mouse&quot;, &quot;headset&quot;, &quot;webcam&quot;}

produtos_em_ambas = loja_a &amp; loja_b

print(produtos_em_ambas) # {&quot;notebook&quot;, &quot;mouse&quot;}

produtos_unicos_a = loja_a - loja_b

print(produtos_unicos_a) # {&quot;teclado&quot;, &quot;monitor&quot;}

todos_produtos = loja_a | loja_b

print(todos_produtos) # {&quot;notebook&quot;, &quot;mouse&quot;, &quot;teclado&quot;, &quot;monitor&quot;, &quot;headset&quot;, &quot;webcam&quot;}</code></pre>

<h3>Modificando Sets</h3>

<p>Como sets são mutáveis, você pode adicionar e remover elementos:</p>

<pre><code class="language-python">numeros = {1, 2, 3}

Adicionar um elemento

numeros.add(4)

print(numeros) # {1, 2, 3, 4}

Adicionar já existente não causa erro, apenas é ignorado

numeros.add(2)

print(numeros) # {1, 2, 3, 4} — sem mudança

Remover com garantia de existência

numeros.remove(2)

print(numeros) # {1, 3, 4}

Tentar remover inexistente causa erro

numeros.remove(10) # KeyError

Remover com segurança

numeros.discard(10) # Não causa erro se não existe

print(numeros) # {1, 3, 4}

Remover todos os elementos

numeros.clear()

print(numeros) # set()</code></pre>

<h2>Dicionários: Mapeamento Chave-Valor</h2>

<h3>Estrutura e Conceito</h3>

<p>Um dicionário é uma coleção de pares chave-valor, desordenada (em Python 3.7+, na verdade mantém ordem de inserção, mas não dever ser tratada como uma garantia formal até Python 3.7+), e extremamente eficiente para buscas. Diferentemente de listas que usam índices numéricos, dicionários usam chaves que podem ser strings, números ou tuplas.</p>

<p>Dicionários são criados com chaves <code>{}</code> separando chave e valor com <code>:</code>:</p>

<pre><code class="language-python"># Criando dicionários

usuario = {

&quot;nome&quot;: &quot;Alice&quot;,

&quot;idade&quot;: 25,

&quot;email&quot;: &quot;alice@email.com&quot;

}

numeros_pares = {1: 2, 2: 4, 3: 6, 4: 8}

vazio = {}

Acessando valores

print(usuario[&quot;nome&quot;]) # Alice

print(numeros_pares[2]) # 4

Acessar com .get() é mais seguro — retorna None se não existe

print(usuario.get(&quot;telefone&quot;)) # None

print(usuario.get(&quot;telefone&quot;, &quot;N/A&quot;)) # N/A (valor padrão)

Verificar se chave existe

if &quot;email&quot; in usuario:

print(usuario[&quot;email&quot;]) # alice@email.com</code></pre>

<h3>Modificando Dicionários</h3>

<p>Dicionários são mutáveis, permitindo adicionar, modificar e remover pares chave-valor:</p>

<pre><code class="language-python">usuario = {&quot;nome&quot;: &quot;Alice&quot;, &quot;idade&quot;: 25}

Adicionar ou modificar

usuario[&quot;idade&quot;] = 26

usuario[&quot;cidade&quot;] = &quot;São Paulo&quot;

print(usuario) # {&quot;nome&quot;: &quot;Alice&quot;, &quot;idade&quot;: 26, &quot;cidade&quot;: &quot;São Paulo&quot;}

Remover com del

del usuario[&quot;cidade&quot;]

print(usuario) # {&quot;nome&quot;: &quot;Alice&quot;, &quot;idade&quot;: 26}

Remover com pop() — retorna o valor

nome = usuario.pop(&quot;nome&quot;)

print(nome) # Alice

print(usuario) # {&quot;idade&quot;: 26}

Atualizar com múltiplos pares

usuario.update({&quot;nome&quot;: &quot;Alice&quot;, &quot;profissao&quot;: &quot;Engenheira&quot;})

print(usuario) # {&quot;idade&quot;: 26, &quot;nome&quot;: &quot;Alice&quot;, &quot;profissao&quot;: &quot;Engenheira&quot;}</code></pre>

<h3>Iteração em Dicionários</h3>

<p>Existem diferentes maneiras de iterar sobre um dicionário, cada uma útil em contextos específicos:</p>

<pre><code class="language-python">produto = {&quot;nome&quot;: &quot;Notebook&quot;, &quot;preco&quot;: 2500, &quot;estoque&quot;: 5}

Iterar sobre chaves

for chave in produto:

print(chave) # nome, preco, estoque

Iterar sobre valores

for valor in produto.values():

print(valor) # Notebook, 2500, 5

Iterar sobre pares chave-valor (recomendado)

for chave, valor in produto.items():

print(f&quot;{chave}: {valor}&quot;)

nome: Notebook

preco: 2500

estoque: 5

Dict comprehension — similar a list comprehension

precos = {&quot;notebook&quot;: 2500, &quot;mouse&quot;: 50, &quot;teclado&quot;: 150}

precos_com_desconto = {item: preco * 0.9 for item, preco in precos.items()}

print(precos_com_desconto)

{&quot;notebook&quot;: 2250.0, &quot;mouse&quot;: 45.0, &quot;teclado&quot;: 135.0}</code></pre>

<h3>Casos de Uso Prático com Dicionários</h3>

<p>Dicionários são fundamentais para trabalhar com dados estruturados, especialmente JSON e APIs:</p>

<pre><code class="language-python"># Simulando resposta de API JSON

resposta_api = {

&quot;usuarios&quot;: [

{&quot;id&quot;: 1, &quot;nome&quot;: &quot;Alice&quot;, &quot;ativo&quot;: True},

{&quot;id&quot;: 2, &quot;nome&quot;: &quot;Bob&quot;, &quot;ativo&quot;: False},

{&quot;id&quot;: 3, &quot;nome&quot;: &quot;Carlos&quot;, &quot;ativo&quot;: True}

],

&quot;total&quot;: 3

}

Processando dados

usuarios_ativos = [u for u in resposta_api[&quot;usuarios&quot;] if u[&quot;ativo&quot;]]

print(usuarios_ativos)

[{&quot;id&quot;: 1, &quot;nome&quot;: &quot;Alice&quot;, &quot;ativo&quot;: True}, {&quot;id&quot;: 3, &quot;nome&quot;: &quot;Carlos&quot;, &quot;ativo&quot;: True}]

Contando ocorrências de palavras (caso de uso clássico)

texto = &quot;python python java python javascript java&quot;

palavras = texto.split()

contagem = {}

for palavra in palavras:

contagem[palavra] = contagem.get(palavra, 0) + 1

print(contagem) # {&quot;python&quot;: 3, &quot;java&quot;: 2, &quot;javascript&quot;: 1}

Usando defaultdict para simplificar

from collections import defaultdict

contagem2 = defaultdict(int)

for palavra in palavras:

contagem2[palavra] += 1

print(dict(contagem2)) # {&quot;python&quot;: 3, &quot;java&quot;: 2, &quot;javascript&quot;: 1}</code></pre>

<h2>Comparação Prática Entre as Estruturas</h2>

<p>Para consolidar o aprendizado, aqui está uma comparação prática mostrando qual estrutura usar em diferentes situações:</p>

<pre><code class="language-python"># CENÁRIO 1: Você precisa de uma coleção ordenada que você vai modificar frequentemente

USE: LISTA

tarefas = [&quot;estudar&quot;, &quot;exercício&quot;, &quot;trabalho&quot;]

tarefas.append(&quot;ler&quot;)

tarefas.remove(&quot;exercício&quot;)

CENÁRIO 2: Você quer retornar múltiplos valores de uma função de forma imutável

USE: TUPLA

def buscar_coordenadas():

return (40.7128, 74.0060) # Retorna (latitude, longitude)

lat, lng = buscar_coordenadas()

CENÁRIO 3: Você precisa verificar rapidamente se algo existe e não quer duplicatas

USE: SET

emails_cadastrados = {&quot;alice@email.com&quot;, &quot;bob@email.com&quot;, &quot;carlos@email.com&quot;}

novo_email = &quot;alice@email.com&quot;

if novo_email not in emails_cadastrados:

emails_cadastrados.add(novo_email)

CENÁRIO 4: Você trabalha com dados estruturados (JSON, API, banco de dados)

USE: DICIONÁRIO

perfil_usuario = {

&quot;id&quot;: 1,

&quot;nome&quot;: &quot;Alice&quot;,

&quot;email&quot;: &quot;alice@email.com&quot;,

&quot;configuracoes&quot;: {&quot;tema&quot;: &quot;escuro&quot;, &quot;idioma&quot;: &quot;pt-BR&quot;}

}</code></pre>

<h2>Conclusão</h2>

<p>Você aprendeu que <strong>listas são sua ferramenta principal quando ordem e mutabilidade importam</strong>, permitindo adicionar, remover e modificar elementos com flexibilidade. <strong>Tuplas garantem imutabilidade e são essenciais quando você quer dados que não podem ser acidentalmente alterados</strong>, além de serem ligeiramente mais rápidas e poderem servir como chaves de dicionários. <strong>Sets são especializados em unicidade e operações matemáticas de conjuntos</strong>, oferecendo O(1) para verificação de existência em comparação com O(n) em listas. <strong>Dicionários são indispensáveis para estruturar dados com pares chave-valor</strong>, sendo a base para trabalhar com APIs, JSON e dados estruturados em geral.</p>

<p>A escolha correta entre essas estruturas não é apenas uma questão de funcionalidade — é sobre escrever código eficiente, legível e apropriado para cada problema. Agora que você domina os conceitos, pratique escolhendo a estrutura certa para cada desafio que encontrar.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.python.org/3/tutorial/datastructures.html" target="_blank" rel="noopener noreferrer">Python Official Documentation - Data Structures</a></li>

<li><a href="https://realpython.com/python-lists-tuples/" target="_blank" rel="noopener noreferrer">Real Python - Lists, Tuples, and Sets</a></li>

<li><a href="https://realpython.com/python-dicts/" target="_blank" rel="noopener noreferrer">Real Python - Dictionaries in Python</a></li>

<li><a href="https://automatetheboringstuff.com/2e/chapter4/" target="_blank" rel="noopener noreferrer">Automate the Boring Stuff with Python - Chapter 4: Lists</a></li>

<li><a href="https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range" target="_blank" rel="noopener noreferrer">Python.org - Built-in Types</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em Python

Boas Práticas de Dataclasses em Python: @dataclass, fields e post_init para Times Ágeis
Boas Práticas de Dataclasses em Python: @dataclass, fields e post_init para Times Ágeis

O que são Dataclasses e Por Que Importam Dataclasses são uma ferramenta poder...

Boas Práticas de SQLAlchemy ORM em Python: Models, Relacionamentos e Sessions para Times Ágeis
Boas Práticas de SQLAlchemy ORM em Python: Models, Relacionamentos e Sessions para Times Ágeis

O que é SQLAlchemy ORM e por que você precisa dela SQLAlchemy é a biblioteca...

Guia Completo de Autenticação em FastAPI: JWT, OAuth2 e Segurança de Endpoints
Guia Completo de Autenticação em FastAPI: JWT, OAuth2 e Segurança de Endpoints

Por que Autenticação é Crítica em APIs Modernas Quando você constrói uma API,...