programação i aula 12 mais sobre cadeias e listaspbv/aulas/programacaoi/teorica-12.pdf · listas...
TRANSCRIPT
![Page 1: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/1.jpg)
Programação IAula 12 — Mais sobre cadeias e listas
Pedro Vasconcelos
DCC/FCUP
2018
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 1 / 28
![Page 2: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/2.jpg)
Nesta aula
1 Listas em compreensão
2 Formatação de texto
3 Mais métodos sobre cadeias
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 2 / 28
![Page 3: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/3.jpg)
Listas em compreensão
É muito comum construir uma lista partindo de uma outra:selecionando elementos usando uma condição;aplicando uma transformação a cada elemento.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 3 / 28
![Page 4: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/4.jpg)
Exemplo: calcular quadrados
Construir a lista dos quadrados dos números inteiros de 1 a 9.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 4 / 28
![Page 5: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/5.jpg)
Exemplo: calcular quadrados (cont.)
Solução usando um ciclo for:
lista = []for x in range(1, 10):
lista.append(x**2)print(lista)
Solução usando uma lista em compreensão:
lista = [x**2 for x in range(1,10)]print(lista)
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 5 / 28
![Page 6: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/6.jpg)
Sintaxe
[x**2 for x in range(1,10)]
Notação inspirada na teoria de conjuntos:
{x2 : x ∈ {1, . . . ,9}}
Mais geralmente:
[expressão for variável in sequência]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 6 / 28
![Page 7: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/7.jpg)
Mais exemplos
>>> [i**2 for i in [2,3,5,7]][4, 9, 25, 49]
>>> [1+x/2 for x in [0, 1, 2]][1.0, 1.5, 2.0]
>>> [ord(c) for c in "ABCDEF"][65, 66, 67, 68, 69, 70]
>>> [len(s) for s in"As armas e os barões assinalados".split()]
[2, 5, 1, 2, 6, 11]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 7 / 28
![Page 8: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/8.jpg)
Listas em compreensão com condições
Exemplo: quadrados dos múltiplos de 3 inferiores a 10.
[x**2 for x in range(10) if x%3==0]
Mais geralmente:
[expr for variável in sequência if condição]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 8 / 28
![Page 9: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/9.jpg)
Outro exemplo
Um número natural n é primo se não tem divisores próprios (i.e.maiores do que 1 e menores do que n).
Para testar se n é primo podemos testar se a lista dos divisorespróprios é vazia.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 9 / 28
![Page 10: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/10.jpg)
Testar primos
def primo(n):# lista dos divisores própriosdivs = [d for d in range(2,n) if n%d==0]# n é primo se e só se a lista for vaziareturn len(divs)==0
Nota: esta solução é ineficiente (calcula todos os divisores em vez determinar após encontrar o primeiro. . . )
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 10 / 28
![Page 11: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/11.jpg)
Listas em compreensão embricadas
Podemos usar uma lista em compreensão dentro de outra.
Exemplo:
[[i*j for j in range(1,11)] for i in range(1,11)]
produz a matriz da multiplicação:
[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],[2, 4, 6, 8, 10, 12, 14, 16, 18, 20],[3, 6, 9, 12, 15, 18, 21, 24, 27, 30],
...[9, 18, 27, 36, 45, 54, 63, 72, 81, 90],
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 11 / 28
![Page 12: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/12.jpg)
Compreensões com múltiplas sequências
A ordem do resultado depende da ordem das sequências:
>>> [(x,y) for x in "ABC" for y in range(3)][(’A’, 0), (’A’, 1), (’A’, 2),(’B’, 0), (’B’, 1), (’B’, 2),(’C’, 0), (’C’, 1), (’C’, 2)]
>>> [(x,y) for y in range(3) for x in "ABC"][(’A’, 0), (’B’, 0), (’C’, 0),(’A’, 1), (’B’, 1), (’C’, 1),(’A’, 2), (’B’, 2), (’C’, 2)]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 12 / 28
![Page 13: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/13.jpg)
Sintaxe geral
[expr for var1 in seq1 if cond1for var2 in seq2 if cond2...for varN in seqN if condN]
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 13 / 28
![Page 14: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/14.jpg)
Formatação de texto
Por vezes necessitamos de especificar exatamente como sãomostrados resultados; por exemplo:
algarismos e casas decimais dos números;mostrar ou não zeros à esquerda/direita;alinhar campos entre linhas duma tabela.
Podemos fazer tudo isto em Python com o operador de formatação detexto.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 14 / 28
![Page 15: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/15.jpg)
Operador de formatação
formato % valores
formato uma cadeia com campos marcados com o símbolo ‘%’valores um tuplo de valores (a substituir nos campos).
Exemplos:
>>> "O valor de Pi é %f" % math.pi’O valor de Pi é 3.141593’>>> "%02d/%02d/%4d" % (1, 6, 2013)’01/06/2013’
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 15 / 28
![Page 16: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/16.jpg)
Alguns campos de formatos
%d, %i inteiro decimal com sinal"%d/%3d/%-3d" % (5, 5, 5)’5/ 5/5 ’
%e, %f, %g vírgula flutuante, formato exponencial ou decimal"%f %.3f %e" % (math.pi,math.pi,math.pi)’3.141593 3.142 3.141593e+00’
%s cadeia"(%s/%4s/%-4s)" % ("A", "BC", "D")’(A/ BC/D )’
%% o caracter %"%d%% da nota" % 1212% da nota
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 16 / 28
![Page 17: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/17.jpg)
Exemplo
Tabelar o seno e coseno no intervalo [0, 2π].
Primeira versão (sem formatação).
from math import *print("x", "sin(x)", "cos(x)")for i in range(11):
x = 2*pi/10 * iprint(x, sin(x), cos(x))
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 17 / 28
![Page 18: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/18.jpg)
Exemplo (cont.)
Resultado:
x sin(x) cos(x)0.0 0.0 1.00.6283185307179586 0.5877852522924731 0.80901699437494751.2566370614359172 0.9510565162951535 0.309016994374947451.8849555921538759 0.9510565162951536 -0.309016994374947342.5132741228718345 0.5877852522924732 -0.80901699437494733.141592653589793 1.2246467991473532e-16 -1.03.7699111843077517 -0.587785252292473 -0.80901699437494764.39822971502571 -0.9510565162951535 -0.309016994374947565.026548245743669 -0.9510565162951536 0.309016994374947235.654866776461628 -0.5877852522924734 0.80901699437494736.283185307179586 -2.4492935982947064e-16 1.0
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 18 / 28
![Page 19: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/19.jpg)
Exemplo (cont.)
Segunda versão (usando formatação):
print("%7s %7s %7s" % ("x", "sin(x)", "cos(x)"))for i in range(11):
x = 2*pi/10 * iprint("%7.4f %7.4f %7.4f" % (x,sin(x),cos(x)))
Legenda:
%7.4f campo de vírgula flutuante com 7 carateres no total e4 casas decimais;
%7s campo de texto com 7 carateres no total.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 19 / 28
![Page 20: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/20.jpg)
Exemplo (cont.)
Resultado:
x sin(x) cos(x)0.0000 0.0000 1.00000.6283 0.5878 0.80901.2566 0.9511 0.30901.8850 0.9511 -0.30902.5133 0.5878 -0.80903.1416 0.0000 -1.00003.7699 -0.5878 -0.80904.3982 -0.9511 -0.30905.0265 -0.9511 0.30905.6549 -0.5878 0.80906.2832 -0.0000 1.0000
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 20 / 28
![Page 21: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/21.jpg)
Tabela de multiplicação
Outro exemplo: formatar a tabela da multiplicação de 1 a 10.
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 21 / 28
![Page 22: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/22.jpg)
Tabela de multiplicação (cont.)
# formatar o cabeçalhofmt = " *|" + 10*"%3d "print(fmt % tuple(range(1,11)))print(43*’=’)
# formatar o corpofor i in range(1,11):
linha = [i]for j in range(1,11):
linha.append(i*j)fmt = "%2d|" + 10*"%3d "print(fmt % tuple(linha))
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 22 / 28
![Page 23: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/23.jpg)
Tabela de multiplicação (cont.)
*| 1 2 3 4 5 6 7 8 9 10===========================================1| 1 2 3 4 5 6 7 8 9 102| 2 4 6 8 10 12 14 16 18 203| 3 6 9 12 15 18 21 24 27 304| 4 8 12 16 20 24 28 32 36 405| 5 10 15 20 25 30 35 40 45 506| 6 12 18 24 30 36 42 48 54 607| 7 14 21 28 35 42 49 56 63 708| 8 16 24 32 40 48 56 64 72 809| 9 18 27 36 45 54 63 72 81 90
10| 10 20 30 40 50 60 70 80 90 100
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 23 / 28
![Page 24: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/24.jpg)
Mais métodos sobre cadeias
str.split() partir uma cadeia numa lista das partes delimitadaspor espaços
str.split(sep) partir uma cadeia numa lista das partesdelimitadas pela cadeia sep
str.join(lista) juntar uma lista de cadeias numa só usando strcomo separador
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 24 / 28
![Page 25: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/25.jpg)
Exemplos
>>> "as armas e os barões".split()[’as’, ’armas’, ’e’, ’os’, ’barões’]
>>> "abc-de-fgh".split(’-’)[’abc’, ’de’, ’fgh’]
>>> " ".join([’as’, ’armas’, ’e’, ’os’, ’barões’])’as armas e os barões’
>>> "--".join([’as’, ’armas’, ’e’, ’os’, ’barões’])’as--armas--e--os--barões’
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 25 / 28
![Page 26: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/26.jpg)
Exemplo maior: a cifra de César
Recorde a solução apresentada na aula 8:
def cifrar(k, txt):msg = ""for c in txt:
msg = msg + rodar(k,c)return msg
Esta solução é correta mas ineficiente:acrescenta um carater de cada vez à cadeia txt
isto constroi muitas cadeias intermédiaspodemos evitar isto usando join
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 26 / 28
![Page 27: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/27.jpg)
Exemplo maior: a cifra de César
Recorde a solução apresentada na aula 8:
def cifrar(k, txt):msg = ""for c in txt:
msg = msg + rodar(k,c)return msg
Esta solução é correta mas ineficiente:acrescenta um carater de cada vez à cadeia txt
isto constroi muitas cadeias intermédiaspodemos evitar isto usando join
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 26 / 28
![Page 28: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/28.jpg)
Exemplo maior: a cifra de César (2)
Uma solução melhor:
def cifrar(k, txt):lista = [rodar(k,c) for c in txt]return "".join(lista)
construimos uma lista com os carateres rodadosusamos join para juntar todos carateres numa nova cadeia
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 27 / 28
![Page 29: Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas em compreensão É muito comum construir uma lista partindo de uma outra: selecionando](https://reader034.vdocuments.com.br/reader034/viewer/2022051602/5baa3fe509d3f296258ba08d/html5/thumbnails/29.jpg)
Mais geralmente
Devemos usar
"".join(lista)
em vez de
txt = ""for x in lista:
txt = txt + x
Pedro Vasconcelos (DCC/FCUP) Programação I Aula 12 — Mais sobre cadeias e listas 2018 28 / 28