04 Aula: estruturas de dados (2) e strings
Estrutura de dados (2) e strings¶
Na aula passada aprendemos a mexer com listas, uma das estruturas de dados mais importantes e flexíveis que existe.
Nesta aula veremos outras estruturas de dados importantes como os dicionários, os conjuntos e as tuplas.
Antes disso vamos rever o que aprendemos com as listas.
Também vamos ver mais funcionalidades de strings.
Revisão de listas¶
L = [1,2,3,4] # Como criar uma lista
L
len(L) # Comprimento de uma lista
L[0] # Acessar os elementos da lista
L[1:3] # Fatiamento das listas
L.append(5) # Adicionar um elemento ao final da lista
L
M = [1,2,3,] + [4,5,6,7,8] # Concatenar listas
L.extend([6,7,8]) # Extender lista
L
del L[5:] # Remover elementos da lista
L
L.pop(-1) # Retirar o último elemento da lista e retornar seu valor
L
L.pop(0) # Retirar o primeiro elemento da lista e retornar seu valor
L
# Algo que não vimos!
L*3
Vimos que existem vários métodos¶
Estes métodos podem ser bastante úteis
L = [32,3456,124,687,523,456,23,634,576]
M = L[:] # Cuidado ao copiar a lista!!!
L.index(124) # Buscar índice de elemento da lista
[2,34,3,2,3,6,6,6,6,32,4,4,3,2].count(6)
L.sort() # Reordenar
L
Vimos o algorítimo de Bubble Sort para reordenar listas¶
Dicionários¶
Estrutura de dados semelhante à lista mas com acesso diferente.
Os dicionários em Python são compostos por
- Chaves
- Valores
O dicionário relaciona uma chava a um valor. A cada chave, existe um valor associado.
De certo modo a lista pode ser vista como um dicionário: as chaves são números inteiros ordenados.
Para se criar um dicionário, utilizam-se chaves ({})
Imagine como exemplo, uma lista de preços de um supermercado:
Produto | Preço |
---|---|
Alface | R\$ 0,45 |
Batata | R\$ 1,20 |
Tomate | R\$ 2,30 |
Feijão | R\$ 1,50 |
tabela = {"Alface": 0.45,
"Batata": 1.20,
"Tomate": 2.30,
"Feijão": 1.50}
tabela
Em um dicionário, para se acessar um valor, usa-se a chave:
tabela["Alface"]
Também podemos atribuir um valor à chave:
tabela["Alface"] = 0.55 # Aumentamos o preço
tabela
Se atribuirmos um valor a uma chave que não existe, essa nova chave com este valor será adicionada ao dicionário:
tabela["Cebola"] = 1.35
tabela
Se a chave não existir, ocorrerá um erro:
tabela["Picanha"]
Para se verificar se um chave faz parte do dicionário, use o operador in
:
"Feijão" in tabela
"Manga" in tabela
O método .keys()
retorna uma lista (algo parecido) com as chaves:
tabela.keys()
# Programa para obter o preço da tabela:
tabela = {"Alface": 0.45,
"Batata": 1.20,
"Tomate": 2.30,
"Feijão": 1.50}
while True:
produto = input("Entre com o nome do produto, fim para terminar: ")
if produto == 'fim':
break
if produto in tabela:
print(f"Preço {tabela[produto]:5.2f}")
else:
print("Produto não encontrado!")
Assim como nas listas, podemos apagar uma chave com a instrução del
:
tabela = {"Alface": 0.45,
"Batata": 1.20,
"Tomate": 2.30,
"Feijão": 1.50}
del tabela["Tomate"]
tabela
Quando usar listas ou dicionários?¶
Quando você quer acessar os dados pela chave. Observe que nas versões mais antigas de Python (antes da versão 3.7) a ordem de inserção não era preservada!
O acesso de elementos de listas pode ser mais rápido.
Cuidado ao usar os f-strings com dicionários:
d = {"banana": 2.00, "maçã": 5.00}
f"Banana: R${d['banana']:5.2f} Maçã: R${d['maçã']:5.2f}"
O que pode ser usado como chave em um dicionário?¶
- Strings
- Números
- Tuplas (veremos mais tarde)
Os elementos de um dicionário podem ser qualquer coisa...¶
estoque = {"tomate": [1000, 2.30],
"alface": [500, 0.45],
"batata": [2001, 1.20],
"feijão": [100, 1.5]}
# Programa para atualizar estoque após venda
venda = [["tomate", 5], ["batata",10], ["alface",5]]
total = 0
print("Vendas:\n")
for operação in venda:
produto, quantidade = operação
preço = estoque[produto][1]
custo = preço * quantidade
print(f"{produto:12s}: {quantidade:3d} x {preço:6.2f} = {custo:6.2f}")
estoque[produto][0] -= quantidade
total += custo
print(f" Custo total: {total:21.2f}\n")
print("Estoque:\n")
for chave, dados in estoque.items():
print("Descrição: ", chave)
print("Quantidade: ", dados[0])
print(f"Preço: {dados[1]:6.2f}\n")
Exercício 1¶
Altere o programa anterior de modo que o produto e a quantidade vendida seja solicitada ao usuário. Verifique se o produto digitado existe e só então efetue a baixa no estoque. Também verifique se o estoque é o suficiente para atender ao pedido.
Exercício 2¶
Escreva um programa que que gere um dicionário a partir de uma string onde a chave seja um caracter e o valor o número de vezes que este caracter aparece no dicionário
o rolo -> {'o': 3, ' ': 1, 'l': 1}
Dicionário com valores padrão¶
Algo comum é que ao se recuperar o valor de uma chave, se essa chave não existir, utilizar um valor padrão
d = {}
d["A"] = 1
d["B"] = 2
d
d["C"]
x = d.get("C")
x is None
x = d.get("C", 999)
x
Iterando um dicionário com for
¶
Também dá usar for em um dicionário.
estoque = {"tomate": [1000, 2.30],
"alface": [500, 0.45],
"batata": [2001, 1.20],
"feijão": [100, 1.5]}
for x in estoque:
print(x)
E se você precisa da chave e do valor? Use o método .items()
for c,v in estoque.items():
print("------------")
print(f"Chave: {c}")
print(f"Valor: {v}")
estoque.items()
Tuplas¶
Muito parecida com a lista mas com uma diferença: são imutáveis!
Tem alguma semelhança com as strings. Strings se parecem com listas que não podem ser modificadas. Mas as strings são otimizadas para caracteres.
Apesar de imutáveis, os elementos da tupla podem ter tipos distintos.
Tuplas são parecidas com listas!¶
tupla = ("a", "b", "c")
tupla
tupla[0]
tupla[1]
[1,2,3]*2 # repetição
tupla[1:]
len(tupla)
for e in tupla:
print(e)
# Lembre-se as tuplas são imutáveis!
tupla[1] = 'd'
Tuplas como múltiplos valores, empacotamento e desempacotamento¶
tupla = 100,200,300
tupla
a, b, c = tupla
print(f"a = {a}, b = {b}, c = {c}")
a, b = 10, 20
a,b
# Operação realizada de maneira 'paralela'
a, b = b, a
a,b
Se lembram do bubble sort?
L = [9, 2, 4, 3, 8, 6]
N = len(L)
for i in range(N):
trocou = False
for k in range(N-i-1):
if L[k] > L[k+1]: # Inverter a posição
trocou = True
# Como era antes
# tmp = L[k]
# L[k] = L[k+1]
#L[k+1] = tmp
L[k], L[k+1] = L[k+1], L[k] # Olha só que simples!
if not trocou:
break
L
Tuplas com um elemento¶
t1 = (1)
t1
t2 = (1,)
t2
# Tupla vazia
t3 = ()
t3
Tuplas a partir de listas (e vice e versa):¶
L = [1,2,3]
T = tuple(L)
T
T = (1,2,3)
L = list(T)
L
Concatenação¶
(1,2,3) + (4,5,6)
A tupla é imutável, não seus elementos (pode ou não ser!)¶
T = (1,[2,3,4])
T
T[1].append(5)
T
Exercício 3¶
Explore os métodos disponíveis aos dicionários. Brinque com eles
Mais empacotamento e desempacotamento (listas também podem)¶
tupla = 1,2
a,b = tupla
a,b = 1,2
c,d = [3,4]
print(f"c = {c}, d = {d}")
*a, b = [1,2,3,4,5]
b
a
*a,b = (1,2,3,4,5)
a
b
a,*b = [1,2,3,4,5]
a
b
a,*b,c = [1,2,3,4,5]
a
b
c
*a,b,c = [1,2,3,4,5]
a
b
c
a,b,*c = [1,2,3,4,5]
a
b
c
Conjuntos (set
)¶
Os conjuntos em Python são uma estrutura de dados que funcionam como conjuntos que aprendemos na escola.
Um conjunto é uma coleção de elementos que não são repetidos.
Ah, podemos fazer as operações união e intersecção!
a = {1,2,3} # Notação para conjuntos
a
a.add(4)
a.add(5)
a.add(6)
a
a.add(1)
a
a.add(-1)
a
len(a)
Ver se um elemento pertence a um conjunto:¶
2 in a
123 in a
Criando conjuntos a partir de listas¶
b = set([1,2,3,4,5])
b
b = set([1,2,3,4,5,1,2,3,4,5])
b
Operações com conjuntos¶
Diferença entre conjuntos:
a - b
O resultado é um conjunto com os elementos de a
que não estão em b
a = {0, 1, 2, 3, -1}
b = {2, 3}
a-b
a = {0, 1, 2, 3, -1, 4, 5}
b = {2, 3}
a-b
a = {0, 1, 2, 3, -1}
b = {2, 3, 4}
a-b
União entre conjuntos:
a | b
a = {0,1,2,3,-1}
b = {2,3}
a | b
c = {4,5,6}
a | c
Interseção de conjuntos
a & b
a & c
Exercício 4¶
Veja os métodos disponíveis aos conjuntos. Brinque com eles
Exercício 5¶
Escreva um programa que compare duas listas. Utilizando operações com conjuntos, imprima:
- Os valores comuns às duas listas
- Os valores que só existem na primeira
- Os valores que existem apenas na segunda
- Uma lista com os elementos não repetidos das duas listas
- A primeira lista sem os elementos repetidos na segunda
Qual estrutura de dados utilizar?¶
Listas | Tuplas | Dicionários | Conjuntos | |
---|---|---|---|---|
Ordem dos elementos | Fixa | Fixa | Fixa a partir da versão 3.7 | Indeterminada |
Tamanho | Variável | Fixo | Variável | Variável |
Elementos repetidos | Sim | Sim | Valores mas não chaves | Não |
Pesquisa | Sequencial | Sequencial | Direto pela chave | Direta pelo valor |
Alterações | Sim | Não | Sim | Sim |
Uso primário | Sequências | Sequências constantes | Dados indexados por chave | Verificação de unicidade |
Trabalhando com strings¶
Temos usado strings desde a primeira aula. Strings são úteis e extremamente importantes. Vimos que existem algumas semelhanças entre strings e listas e entre strings e tuplas: strings são sequências imutáveis de caracteres.
s = "Alô mundo"
s[0]
s[0] = 'X'
L = list(s)
L
Strings também têm métodos!¶
s1 = "".join(L)
s1
L = ['a','b','c']
print("".join(L))
print(" ".join(L))
print(".".join(L))
print("_|_".join(L))
s.
Verificação parcial de strings¶
nome = "Instituto de Pesquisas Tecnológicas"
nome.startswith("Inst")
nome.startswith("inst")
Maíusculas e minúsculas¶
nome.upper()
nome.lower()
nome.lower().startswith("inst")
nome.upper().startswith("INST")
"uma frase simples com letras minúsculas".capitalize()
Pesquisando em strings¶
s = "o rato roeu a roupa do rei de roma"
"rato" in s
"Rato" in s
"u a r" in s
"santos" not in s
'roupa' not in s
Cuidado com acentos!!!
s = "além da cúpula do trovão"
"além" in s
"alem" in s
Algumas vezes queremos saber onde se encontra uma substring
s = "o rato roeu a roupa do rei de roma"
i = s.find("roeu")
i
s[i:i+4]
s.find("gato")
Buscando pelo fim
s = "o rato roeu a roupa do rato de roma"
i = s.find("rato")
i
s[i:i+4]
i = s.rfind("rato")
i
s[i:i+4]
Dá para falar de onde queremos começar a procurar!
s.find("rato", 3)
# Programa que pesquisa *todas* as ocorrênicas
s = "um tigre, dois tigres, três tigres"
ss = "tigre"
p = 0
while p > -1:
p = s.find(ss, p)
if p >= 0:
print(f"Posição: {p}")
p += 1
Exercício 6¶
Teste a diferença entre os métodos .find
e .rfind
com .index
e .rindex
Exercício 7¶
Escreva um programa que leia duas strings. Verifique se a segunda ocorre dentro da primeira e imprima sua posição de início
Exercício 8¶
Escreva um programa que leia duas strings e gere uma terceira string com todos os caracteres que aparecem nas duas strings. A ordem não interessa.
Exercício 9¶
Escreva um programa que leia uma string e imprima quantas vezes cada caracter aparece nessa string
Justificação de strings¶
s = 'bola'
s.center(20)
'X' + s.center(10) + 'X'
'X' + s.center(10, '.') + 'X'
s.ljust(10)
s.ljust(10,'.')
s.rjust(10)
s.rjust(10,'.')
Remoção de espaços em branco¶
s = " IPT "
s.strip()
s.rstrip()
s.lstrip()
s.lstrip('.')
s = '.... IPT ... .'
s.strip('.')
s.strip('. ')
s.rstrip(' .')
s.lstrip(' .')
Quebrando strings¶
s = "1,2,3,4,5,6"
s.split(",")
"1 2 3 4 5 6".split(" ")
"1 e 2 e 3 e 4 e 5 e 6".split(" e ")
Substituindo strings¶
s = "um tigre, dois tigres, três tigres"
s.replace("tigre", "gato")
s.replace("tigre", "gato", 1)
s.replace("tigre", "gato", 2)
s.replace("tigre", "")
s.replace("", "-")
Validação por tipo de conteúdo¶
s = "125"
p = "uma pequena frase"
s.isalnum()
p.isalnum()
"abc123".isalnum()
"125".isalpha()
"uma frase pequena".isalpha()
"palavra".isalpha()
"123".isdigit()
"3.14".isdigit()
"-123".isdigit()
"123".isnumeric()
"3.14".isnumeric()
# .isdigit() -> caracteres numéricos em Unicode
s = "\u2153"
s
s.isnumeric()
s.isdigit()
Como reconhecer se o número é ponto flutuante? Isso é mais chato do que parece. Mas temos aqui uma solução. Aqui introduzimos uma nova funcionalidade: exceções:
s = "123e23"
try:
float(s)
isfloat = True
except:
isfloat = False
isfloat
" ".isspace()
"\n\r\t ".isspace()
"\n\t\r".isprintable()
"um testo simples".isprintable()
"ABC".isupper()
"ABC".islower()
"abc".isupper()
"abc".islower()
"Abc".istitle()
"ABC".istitle()
"abc".istitle()
Formatação de strings¶
Já temos usado bastante isso.
"{0} {1}".format("Oi", "mundo")
"{} {} {}".format(1,2,3)
"{2} {1} {0}".format(1,2,3)
"X{0:<10}X".format("IPT")
"X{0:>10}X".format("IPT")
"X{0:^10}X".format("IPT")
"X{0:.<10}X".format("IPT")
"X{0:.^10}X".format("IPT")
Os parâmetros de format
podem ser uma lista:
"{0[0]} {0[1]} {1[0]} {1[1]}".format([1,2], [3,4])
Até mesmo um dicionário:
"{0[nome]} {0[telefone]} {1[0]} {1[1]}".format({"telefone": "3767-0000", "nome": "João"}, [1,2])
Tem como formatar números. Na verdade esta formatação é quase uma minilinguagem. Para maiores informações, veja a documentação oficial do Python:
Jogo da forca¶
palavra = input("Digite a plavra secreta: ").strip().lower()
for x in range(100):
print()
digitadas = []
acertos = []
erros = 0
while True:
senha = ""
for letra in palavra:
senha += letra if letra in acertos else "."
print(senha)
if senha == palavra:
print("Você acertou!")
break
tentativa = input("\nDigite uma letra: ").strip().lower()
if tentativa in digitadas:
print("Você já tentou esta letra!")
continue
else:
digitadas += tentativa
if tentativa in palavra:
acertos += tentativa
else:
erros += 1
print("Você errou!")
print("||==:==\n|| : ")
print("|| O " if erros >= 1 else "||")
linha2 = ""
if erros == 2:
linha2 = " | "
elif erros == 3:
linha2 = " \| "
elif erros >= 4:
linha2 = " \|/ "
print(f"||{linha2}")
linha3 = ""
if erros == 5:
linha3 += " / "
elif erros >= 6:
linha3 += " / \ "
print(f"||{linha3}")
print("||\n==========")
if erros == 6:
print("Enforcado!")
break
Escrevendo scripts¶
Scripts são pequenos programas que fazem alguma tarefa específica. Python surgiu como uma linguagem de script e é muito usada para isso.
Um exemplo comum é executar um programa repetidas vezes mudando algum dado de entrada.
Aqui, vamos fazer um script com o jogo de forca acima. Convenhamos, usar isso no notebook jupyter não é a melhor coisa do mundo...
Para se fazer o script, você vai precisar usar um editor de texto. Pode ser o spyder, notepad++, geany, visual studio code, emacs ou qualquer editor de texto. Não processador de texto. Não vai funcionar com o Word!!!
Crie um arquivo novo e copie e cole o programa acima. Chame o arquivo de forca.py
Agora basta você executar
python forca.py
Tem como tornar isso um pouco melhor.
No Linux ou Unix¶
Em linux (e mac OS?) é interessante adicionar a seguinte linha no topo:
#!/usr/bin/env python3
aí você torna o arquivo executável com a seguinte linha de comando
chmod +x forca.py
Agora o arquivo funciona como se fosse um executável!
No windows¶
Se você instalou o python, clique duplo no arquivo forca.py já deveria funcionar. Se a associação da extensão do arquivo estiver correta.
Na linha de comando você pode fazer algo parecido com o Linux. Na primeira linha, coloque o caminho para o executável do Python. No meu computador, esta primeira linha é:
#!"C:\ProgramData\Anaconda3\python.exe"
Aí você pode usar o programa como se fosse um executável.
Exercício 10¶
Modifique o jogo da forca de forma que a palavra secreta seja escrita caso o jpgador perca
Exercício 11¶
Modifique o jogo da forca de forma a utilizar uma lista de palavras. No início pergunte um número e calcule o índice da palavra a utilizar pela fórmula:
índice = (número * 776) % len(lista_de_palavras)
Comentários
Comments powered by Disqus