42
Seja mais Pythonico: List Comprehension Elloá B. Guedes [email protected] www.elloaguedes.com ˆ

Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Seja mais Pythonico: List Comprehension

Elloá B. Guedes

[email protected]

ˆ

Page 2: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

List Comprehension

• Jeitosucinto decriarlistasbaseando-seemlistasexistentes

• Maneiraelegante• Menoslinhasdecódigo• Maneira deser mais pythônico

• Você consegue omesmo resultado sem listcomprehension

Page 3: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 1

• Querosepararasletrasdeumastring emumalista

frase = "paralelepipedo”lista = []for letra in frase:

lista.append(letra)print(lista)

Page 4: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

• Querosepararasletrasdeumastring emumalista

frase = "paralelepipedo”lista = []for letra in frase:

lista.append(letra)print(lista)

['p', 'a', 'r', 'a', 'l', 'e', 'l', 'e', 'p', 'i', 'p', 'e', 'd', 'o']

Exemplo 1

Page 5: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 1

• Querosepararasletrasdeumastring emumalistacomlistcomprehension

frase = "paralelepipedo”lista = [letra for letra in frase]print(lista)

Page 6: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 1

• Querosepararasletrasdeumastring emumalistacomlistcomprehension

frase = "paralelepipedo”lista = [letra for letra in frase]print(lista)

['p', 'a', 'r', 'a', 'l', 'e', 'l', 'e', 'p', 'i', 'p', 'e', 'd', 'o']

Page 7: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

List Comprehension

• Ideia geral

umaLista = [x for x in iterável]

Page 8: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

List Comprehension

• Ideia geral

umaLista = [x for x in iterável]

Listas, strings e tuplas

Page 9: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 2

• Queroformarumalistanovaapartirdeumalistaantiga,excluindoosnúmeros pares

lista = [x for x in listaOriginal if x % 2 !=0]

Page 10: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 2

• Queroformarumalistanovaapartirdeumalistaantiga,excluindoosnúmeros pares

lista = [x for x in listaOriginal if x % 2 !=0]

Checagem de condição

Page 11: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 3

• Quero uma lista comtodos os caracteres deuma stringemmaiúsculo

• Pensando…• Listcomprehensionpra obter os caracteres• Depois faço iteração pra transformar todos emmaiúsculos

Page 12: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 3

• Quero uma lista comtodos os caracteres deuma stringemmaiúsculo• Você pode fazertudo deuma única vez!

lista = [x.upper() for x in frase]

Page 13: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 3

• Quero uma lista comtodos os caracteres deuma stringemmaiúsculo• Você pode fazertudo deuma única vez!

lista = [x.upper() for x in frase]

Lembre-se: strings são imutáveis!

Page 14: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 4

• Quero uma lista comofatorial detodos os números ímpares deuma listaoriginal• Listcomprehension+função+if

Page 15: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 4

• Quero uma lista comofatorial detodos os números ímpares deuma listaoriginal• Listcomprehension+função+if

import mathlista = [math.factorial(x) for x in listaOriginal if x % 2 != 0]

Page 16: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

Page 17: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

• Preciso criar entãouma lista comos números de1a100edepoisusar listcomprehension+if?

Page 18: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

lista = [x for x in range(1,100,2)]

Page 19: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

lista = [x for x in range(1,100,2)]

Page 20: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

lista = [x for x in range(1,100,2)]

Início: opcionalSe omitido, considera-se zero

Page 21: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

lista = [x for x in range(1,100,2)]

Limite: ObrigatórioNão será incluído

Page 22: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 5

• Quero todos os números ímpares de1a100

lista = [x for x in range(1,100,2)]

Salto: OpcionalSe omitido, igual a 1

Page 23: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 6

• Quais são os números entre1e100divisíveispor 3epor 5?

Page 24: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 6

• Quais são os números entre1e100divisíveispor 3epor 5?

lista = [x for x in range(1,101) if (((x % 3)==0) and ((x%5)==0))]

Page 25: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 6

• Quais são os números entre1e100divisíveispor 3epor 5?

lista = [x for x in range(1,101) if (((x % 3)==0) and ((x%5)==0))]

Expressãológica

Page 26: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 6

• Quais são os números entre1e100divisíveispor 3epor 5?

lista = [x for x in range(1,101) if ((x % 3)==0) if ((x%5)==0)]

Page 27: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 6

• Quais são os números entre1e100divisíveispor 3epor 5?

lista = [x for x in range(1,101) if ((x % 3)==0) if ((x%5)==0)]

Ifs aninhados

Page 28: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 7

• Faça uma lista comnúmeros de1a100em que:• Seonúmero forpar,armazene oseu cubo• Em caso contrário,armazene oseu quadrado

• Noção deif-else

Page 29: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 7

• Faça uma lista comnúmeros de1a100em que:• Seonúmero forpar,armazene oseu cubo• Em caso contrário,armazene oseu quadrado

lista = [x**3 if (x%2 ==0) else x**2 for x in range(1,101)]

Page 30: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 7

• Faça uma lista comnúmeros de1a100em que:• Seonúmero forpar,armazene oseu cubo• Em caso contrário,armazene oseu quadrado

lista = [x**3 if (x%2 ==0) else x**2 for x in range(1,101)]

Page 31: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 8

• Listcomprehensionem loopsaninhados

lista = []for x in [20, 40, 60]:

for y in [2, 4, 6]: lista.append(x * y)

print(lista)

Page 32: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 8

• Listcomprehensionem loopsaninhados

lista = []for x in [20, 40, 60]:

for y in [2, 4, 6]: lista.append(x * y)

print(lista)

[40, 80, 120, 80, 160, 240, 120, 240, 360]

Page 33: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 8

• Listcomprehensionem loopsaninhados

lista = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]

[40, 80, 120, 80, 160, 240, 120, 240, 360]

Page 34: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 9

• Às vezes temos duas listas demesmo tamanho (sincronizadas)• Queremosmapear os elementosdeuma lista paraoutra• Ideia dedicionário

# Quantas pessoas cada uma convidou para o pyladieslista1 = [“Jessica”,”Juliany”,”Elloa”,”Daniele"]lista2 = [15, 17, 10, 22]

Page 35: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 9

• Às vezes temos duas listas demesmo tamanho (sincronizadas)• Queremosmapear os elementosdeuma lista paraoutra• Ideia dedicionário# Quantas pessoas cada uma convidou para o pyladieslista1 = [“Jessica”,”Juliany”,”Elloa”,”Daniele"]lista2 = [15, 17, 10, 22]d= {}for i in range(len(lista1)):

d[lista1[i]] = lista2[i]print(d)

Page 36: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 9

• Às vezes temos duas listas demesmo tamanho (sincronizadas)• Queremosmapear os elementosdeuma lista paraoutra• Ideia dedicionário# Quantas pessoas cada uma convidou para o pyladieslista1 = [“Jessica”,”Juliany”,”Elloa”,”Daniele"]lista2 = [15, 17, 10, 22]d= {}for i in range(len(lista1)):

d[lista1[i]] = lista2[i]print(d)

{'Jessica': 15, 'Daniele': 22, 'Juliany': 17, 'Elloa': 10}

Page 37: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 9

• Às vezes temos duas listas demesmo tamanho (sincronizadas)• Queremosmapear os elementosdeuma lista paraoutra• Ideia dedicionário

# Quantas pessoas cada uma convidou para o pyladieslista1 = ["Jessica","Juliany","Elloa","Daniele"]lista2 = [15, 17, 10, 22]d = {lista1[i]: lista2[i] for i in range(len(lista1))}print(d)

{'Jessica': 15, 'Daniele': 22, 'Juliany': 17, 'Elloa': 10}

Page 38: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 10

• Umexemplo interessantecomstrings• Determinar quais stringsdeuma listas são palíndromas• Pense comlistcomprehension!

Page 39: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 10

• Umexemplo interessantecomstrings• Determinar quais stringsdeuma listas são palíndromas• Pense comlistcomprehension!

novaLista = [x for x in lista if x == x[::-1]]

Page 40: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Exemplo 9

• Umexemplo interessantecomstrings• Determinar quais stringsdeuma listas são palíndromas• Pense comlistcomprehension!

novaLista = [x for x in lista if x == x[::-1]]

Fatiamento da string

Page 41: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Finalizando...

• Listcomprehension:umamaneira deser mais pythônico!• Menos linhas decódigo• Aproxima danotação matemática• Melhoria na legibilidade

• Autores argumentamque há melhoriasnotempodeexecução• ~35%mais rápido que laços comfor• ~45%mais rápido que laços commap

Page 42: Seja mais Pythonico: ˆ List Comprehension · ListComprehension • Jeito sucintode criar listas baseando-se em listas existentes • Maneira elegante • Menos linhas de código

Elloá[email protected]

Obrigada!