Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas...

29
Programação I Aula 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

Transcript of Programação I Aula 12 Mais sobre cadeias e listaspbv/aulas/programacaoI/teorica-12.pdf · Listas...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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