⬅ Voltar ao Dashboard Capítulo 6 — Listas

🛠️ Aplicações com Listas

Seção 6.12–6.15 — Operações, strings e listas aninhadas

⚙️ 6.12 Operações com listas

Podemos percorrer uma lista de forma a verificar o menor e o maior valor (Listagem 6.33). Utilizamos um pequeno truque, inicializando o máximo com o valor do primeiro elemento. Precisamos de um valor para máximo antes de utilizá-lo na comparação com if. Se usássemos 0, não teríamos problema, desde que nossa lista não tenha valores negativos.

Listagem 6.33 — Verificação de maior valorv=[7,2,4] máximo=v[0] for e in v: if e > máximo: máximo = e print(máximo)

Exercício 6.12

Altere o programa da listagem 6.33 de forma a imprimir o menor elemento da lista.

Exercício 6.13

A lista de temperaturas de Mons, na Bélgica, foi armazenada na lista T = [-10, -8, 0, 1, 2.5, -2, -4]. Faça um programa que imprima a menor e a maior temperatura, assim como a temperatura média.

🎬 6.13 Aplicações

Vejamos uma situação na qual temos que selecionar os elementos de uma lista de forma a copiá-los para duas listas. Para simplificar o problema, imagine que os valores estejam inicialmente na lista V, mas que devem ser copiados para P se forem pares, ou para I se forem ímpares (Listagem 6.34):

Listagem 6.34 — Cópia de elementos para outras listasV=[5,8,7,12,8,13,21] P=[] I=[] for e in V: if e % 2 == 0: P.append(e) else: I.append(e) print("Pares: ", P) print("Ímpares: ", I)

Vejamos agora um programa que controla a utilização das salas de um cinema. Imagine que a lista salas = [10,2,1,3,0] contenha o número de lugares vagos nas salas 1, 2, 3, 4 e 5, respectivamente. Esse programa lerá o número da sala e a quantidade de lugares solicitados. Ele deve informar se é possível vender o número de bilhetes, atualizará o número de lugares livres e caso seja possível vender, digitar 0 encerra o programa (Listagem 6.35):

Listagem 6.35 — Controle da utilização de salas de um cinemalugares_vagos=[10,2,1,3,0] while True: sala=int(input("Sala (0 sai): ")) if sala == 0: print("Fim") break if sala>len(lugares_vagos) or sala<1: print("Sala inválida") elif lugares_vagos[sala-1]==0: print("Desculpe, sala lotada!") else: lugares=int(input("Quantos lugares você deseja (%d vagos):" % lugares_vagos[sala-1])) if lugares > lugares_vagos[sala-1]: print("Esse número de lugares não está disponível.") elif lugares < 0: print("Número inválido") else: lugares_vagos[sala-1]-=lugares print("%d lugares vendidos" % lugares) print("Utilização das salas") for x,l in enumerate(lugares_vagos): print("Sala %d - %d lugar(es) vazio(s)" % (x+1, l))

💡 Note que usamos enumerate para imprimir a utilização das salas, combinando índice e valor em um único for. O índice x começa em 0, por isso usamos x+1 para exibir o número da sala corretamente.

📝 6.14 Listas com strings

No capítulo 3 vimos que strings podem ser indexadas ou acessadas letra por letra. Listas em Python funcionam da mesma forma, permitindo o acesso a vários valores e se tornando uma das principais estruturas de programação da linguagem. Vejamos outro exemplo de listas, mas utilizando strings, na Listagem 6.36:

Listagem 6.36 — Listas com strings>>> S=["maçãs", "peras", "kiwis"] >>> print(len(S)) 3 >>> print(S[0]) maçãs >>> print(S[1]) peras >>> print(S[2]) kiwis

O programa da Listagem 6.37 lê e imprime uma lista de compras até que seja digitado "fim":

Listagem 6.37 — Lendo e imprimindo uma lista de comprascompras=[] while True: produto=input("Produto:") if produto == "fim": break compras.append(produto) for p in compras: print(p)

Um fator interessante é que podemos acessar as strings dentro da lista, letra por letra, usando um segundo índice. Vejamos as Listagens 6.38 e 6.39:

Listagem 6.38 — Listas com strings, acessando letras>>> S=["maçãs", "peras", "kiwis"] >>> print(S[0][0]) m >>> print(S[0][1]) a >>> print(S[1][1]) e >>> print(S[2][2]) w
Listagem 6.39 — Impressão de uma lista de strings, letra a letraL=["maçãs", "peras", "kiwis"] for s in L: for letra in s: print(letra)

🗂️ 6.15 Listas dentro de listas

Isso nos leva a outra vantagem das listas em Python: listas dentro de listas. Como bônus, temos também que os elementos de uma lista não precisam ser do mesmo tipo. Vejamos um exemplo onde teríamos uma lista de compras na Listagem 6.40. O primeiro elemento seria o nome do produto; o segundo, a quantidade; e o terceiro, seu preço.

Listagem 6.40 — Listas com elementos de tipos diferentesproduto1 = [ "maçã", 10, 0.30] produto2 = [ "pera", 5, 0.75] produto3 = [ "kiwi", 4, 0.98]

Assim, produto1, produto2, produto3 seriam três listas com três elementos cada uma. Observe que o primeiro elemento é do tipo string; o segundo, do tipo inteiro; e o terceiro, do tipo ponto flutuante (float)! Vejamos agora outra lista na Listagem 6.41:

Listagem 6.41 — Listas de listasproduto1 = [ "maçã", 10, 0.30] produto2 = [ "pera", 5, 0.75] produto3 = [ "kiwi", 4, 0.98] compras = [ produto1, produto2, produto3] print(compras)

Agora temos uma lista chamada compras, também com três elementos, mas cada elemento é uma lista à parte. Para imprimir essa lista, teríamos o programa da Listagem 6.42:

Listagem 6.42 — Impressão das comprasproduto1 = ["maçã", 10, 0.30] produto2 = ["pera", 5, 0.75] produto3 = ["kiwi", 4, 0.98] compras = [ produto1, produto2, produto3] for e in compras: print("Produto: %s" % e[0]) print("Quantidade: %d" % e[1]) print("Preço: %5.2f" % e[2])

Da mesma forma, poderíamos ter acessado o preço do segundo elemento com compras[1][2]. Vejamos agora um programa completo, capaz de perguntar nome do produto, quantidade e preço e, no final, imprimir uma lista de compras completa (Listagem 6.43):

Listagem 6.43 — Criação e impressão da lista de comprascompras = [ ] while True: produto = input("Produto: ") if produto == "fim": break quantidade = int(input("Quantidade: ")) preço = float(input("Preço: ")) compras.append([produto, quantidade, preço]) soma = 0.0 for e in compras: print("%20s x%5d %5.2f %6.2f" % (e[0], e[1],e[2], e[1] * e[2])) soma += e[1] * e[2] print("Total: %7.2f" % soma)

💡 Listas dentro de listas são chamadas de listas aninhadas ou matrizes. Elas são fundamentais para representar tabelas, grades, imagens e muitas outras estruturas de dados bidimensionais em programas reais.