Estruturas de Dados
em Python
Ricardo Paiva (Senior Developer @ Globo.com)
Tipos primitivos
Numéricos:
int (long em C)
float (double em C)
long (sufixo L)
0.1 + 0.2 != 0.3
Booleano: True, False
True e False são subclasses de int
Falso
None, False, 0, 0.0, 0L, ‘’, (), []
Strings
Literais: '' ou ""
Unicode: u"Globo.com"
Raw: r"abc/"
Strings são imutáveis
Podem ser acessadas como um array
nome = "techtudo"
nome[0] # returns "t"
nome[4:10] # returns "tudo"
Listas (1)
lista = [2, 1, 12, 1, 0]
len(lista) # 5
lista[0] = 10 # [10, 1, 12, 1, 0]
lista[0:2] # [10, 1]
lista[:3] # [10, 1, 12]
lista[3:] # [1, 0]
lista[-1] # 0 (último elemento)
lista[1:-1] # [1, 12, 1]
0 based e mutáveis
Possuem ordem
Listas (2)
lista.append(20) # [10, 1, 12, 1, 0, 20]
lista.extend([2, 3]) # [10, 1, 12, 1, 0, 20, 2, 3]
lista[0:3] = [2] # [2, 1, 0, 20, 2, 3]
lista + [4, 5] # [2, 1, 0, 20, 2, 3, 4, 5]
lista.remove(20) # [2, 1, 0, 2, 3]
lista.pop(0) # [1, 0, 2, 3, 4]
1 in lista # True
lista.index(1) # 0
lista2 = list(lista) # copia a lista
lista3 = lista[:] # também copia a lista
Tuplas
Tuplas são imutáveis
Em geral associadas a listas heterogêneas
x=(10, 20)
x[0] # 10
a = () # lista vazia
a = (1,) # lista unitária
i, j = (3, 4) # atribuição de variáveis
(i, j) = (j, i+1) # alternando valor de variáveis
x = 20, 30 # omitindo o parêntese
Set
Lista desordenada que não contém elementos duplicados
x = set([10, 2, 1, 4, 10, 1]) # [1, 10, 4, 2]
x.add(5) # [1, 10, 4, 2, 5]
12 in x # False
y = set([3, 4])
x | y # União [1, 10, 4, 2, 5, 3]
x & y # Interseção [4]
x - y # Diferença [1, 10, 2, 5]
x ˆ y # Diferença simétrica [1, 10, 2, 5, 3]
Dicionário (hash)
Conjunto desordenado de valores indexados por uma
chave imutável
dados = {"nome": "Ricardo", "visitas": 10}
dados["nome"] # "Ricardo"
dados["visitas"] += 1 # 11
"nome" in dados # True
dados.get("likes", 0) # Se a chave não
# existir, retorna 0
dados.keys() # ["nome", "visitas"]
dados.values() # ["Ricardo", 10]
dados.items() #[("nome", "Ricardo"), ("visitas", 10)]
http://www.laurentluce.com/posts/python-dictionary-implementation/
Pilha e Fila
Pilha
stack = [3, 1, 5]
stack.append(2) # [3, 1, 5, 2]
stack.pop() # [3, 1]
Listas não são eficientes para inserção no início
from collections import deque
fila = deque([5, 8])
fila.append(10) # [5, 8, 10]
fila.popleft() # [8, 10]
Percorrendo uma sequência
lista = [1, 4, 2, 3, 8]
for n in lista:
print n
for i in xrange(len(lista)): #xrange or range?
print i
for i, j in enumerate(lista):
print i, j
d = {'a': 1, 'b': 2, 'c': 3}
for k, v in d.items():
print k, v
Lista infinita (yield)
Pode-se criar uma lista a partir de uma função
def fibonacci():
i, j = 0, 1
while True:
yield j
i, j= (j, i+j)
for i, n in enumerate(fibonacci()):
print n
if i > 10: break
List Comprehension
blocked = []
for user in users:
if users.is_blocked():
blocked.append(users.email)
blocked = [u.email for u in users if user.is_blocked()]
plantao = [c for c in conteudos if not c.is_pubeditorial()]
Dict Comprehension
# python 2.6
plantao = dict((c.uri, c) for c in conteudo_semantico)
# python 3
plantao ={c.uri: c for c in conteudo_semantico}
Set Comprehension
vogais = set()
for l in "minha frase":
if l in "aeiou":
vogais.add(l)
vogais = {l for l in "minha frase" if l in "aeiou"}
map(function, iterable)
def c2f(c):
return 9.0/5.0*c + 32
c_temps = [39.2, 36.5, 37.3, 37.9]
f_temps = map(c2f, c_temps)
# [102.56, 97.7, 99.14, 100.22]
--- ou ---
f_temps = map(lambda c:9.0/5.0*c + 32, c_temps)
map - executação uma função para cada elemento de
uma lista
filter(function, iterable)
filter - filtra cada elemento da lista (deve retornar True or
False)
active_users = filter(lambda u: u.is_active(), users)
excluded = filter(lambda u: u.email in blacklist, users)
reduce(function, iterable)
reduce - executa uma operação de redução de todos os
valores para um único valor
notas = [9, 8.5, 8.8, 9.1]
maior_nota = reduce(lambda x, y: x if x > y else y, notas)
# 9.1
depositos = [100, 130, 90]
juros = 0.01
soma = reduce(lambda x, y: x * (1 + juros) + y, depositos)
sorted(list, [key])
Ordena uma lista sem alterar o original
notas = [9, 8.5, 8.8, 9.1]
sorted(notas) # [8.5, 8.8, 9, 9.1]
sorted(notas, reverse=True) # [9.1, 9, 8.8, 8.5]
produtos=[{"size":10, "cost":5},
{"size":12, "cost":9},
{"size":8, "cost":6}]
sorted(produtos, key=lambda x: x["cost"])
notas = [9, 8.5, 8.8, 9.1, 8, 7, 4.3, 7.2]
todos_aprovados = all([n >= 6 for n in notas])
tem_recuperacao = any([n < 6 for n in notas])
media_turma = sum(notas) / len(notas)
maior_nota = max(notas)
menor_nota = min(notas)
aprovados = [n for n in notas if n >=6]
media_aprovados = sum(aprovados) / len(aprovados)
all(), any(), sum(), max(), min()
Exemplos (1)
Iniciando um vetor
vetor = [0] * 10 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Iniciando uma matrix nxm
matriz = [[0 for i in xrange(m)] for j in xrange(n)]
matriz[0][0] = 1
Exemplos (2)
lista=[1, 2, 1, 3, 2, 1, 4, 2, 1, 1]
max(set(lista), key=lista.count)
Elemento que mais aparece numa lista
FizzBuzz
fizzbuzz = ["Fizz"*(i%3==0) + "Buzz"*(i%5==0) or str(i)
for i in xrange(1, 100)]
Obrigado!
ricardo.paiva@corp.globo.com

Estruturas de dados em Python

  • 1.
    Estruturas de Dados emPython Ricardo Paiva (Senior Developer @ Globo.com)
  • 2.
    Tipos primitivos Numéricos: int (longem C) float (double em C) long (sufixo L) 0.1 + 0.2 != 0.3 Booleano: True, False True e False são subclasses de int Falso None, False, 0, 0.0, 0L, ‘’, (), []
  • 3.
    Strings Literais: '' ou"" Unicode: u"Globo.com" Raw: r"abc/" Strings são imutáveis Podem ser acessadas como um array nome = "techtudo" nome[0] # returns "t" nome[4:10] # returns "tudo"
  • 4.
    Listas (1) lista =[2, 1, 12, 1, 0] len(lista) # 5 lista[0] = 10 # [10, 1, 12, 1, 0] lista[0:2] # [10, 1] lista[:3] # [10, 1, 12] lista[3:] # [1, 0] lista[-1] # 0 (último elemento) lista[1:-1] # [1, 12, 1] 0 based e mutáveis Possuem ordem
  • 5.
    Listas (2) lista.append(20) #[10, 1, 12, 1, 0, 20] lista.extend([2, 3]) # [10, 1, 12, 1, 0, 20, 2, 3] lista[0:3] = [2] # [2, 1, 0, 20, 2, 3] lista + [4, 5] # [2, 1, 0, 20, 2, 3, 4, 5] lista.remove(20) # [2, 1, 0, 2, 3] lista.pop(0) # [1, 0, 2, 3, 4] 1 in lista # True lista.index(1) # 0 lista2 = list(lista) # copia a lista lista3 = lista[:] # também copia a lista
  • 6.
    Tuplas Tuplas são imutáveis Emgeral associadas a listas heterogêneas x=(10, 20) x[0] # 10 a = () # lista vazia a = (1,) # lista unitária i, j = (3, 4) # atribuição de variáveis (i, j) = (j, i+1) # alternando valor de variáveis x = 20, 30 # omitindo o parêntese
  • 7.
    Set Lista desordenada quenão contém elementos duplicados x = set([10, 2, 1, 4, 10, 1]) # [1, 10, 4, 2] x.add(5) # [1, 10, 4, 2, 5] 12 in x # False y = set([3, 4]) x | y # União [1, 10, 4, 2, 5, 3] x & y # Interseção [4] x - y # Diferença [1, 10, 2, 5] x ˆ y # Diferença simétrica [1, 10, 2, 5, 3]
  • 8.
    Dicionário (hash) Conjunto desordenadode valores indexados por uma chave imutável dados = {"nome": "Ricardo", "visitas": 10} dados["nome"] # "Ricardo" dados["visitas"] += 1 # 11 "nome" in dados # True dados.get("likes", 0) # Se a chave não # existir, retorna 0 dados.keys() # ["nome", "visitas"] dados.values() # ["Ricardo", 10] dados.items() #[("nome", "Ricardo"), ("visitas", 10)] http://www.laurentluce.com/posts/python-dictionary-implementation/
  • 9.
    Pilha e Fila Pilha stack= [3, 1, 5] stack.append(2) # [3, 1, 5, 2] stack.pop() # [3, 1] Listas não são eficientes para inserção no início from collections import deque fila = deque([5, 8]) fila.append(10) # [5, 8, 10] fila.popleft() # [8, 10]
  • 10.
    Percorrendo uma sequência lista= [1, 4, 2, 3, 8] for n in lista: print n for i in xrange(len(lista)): #xrange or range? print i for i, j in enumerate(lista): print i, j d = {'a': 1, 'b': 2, 'c': 3} for k, v in d.items(): print k, v
  • 11.
    Lista infinita (yield) Pode-secriar uma lista a partir de uma função def fibonacci(): i, j = 0, 1 while True: yield j i, j= (j, i+j) for i, n in enumerate(fibonacci()): print n if i > 10: break
  • 12.
    List Comprehension blocked =[] for user in users: if users.is_blocked(): blocked.append(users.email) blocked = [u.email for u in users if user.is_blocked()] plantao = [c for c in conteudos if not c.is_pubeditorial()]
  • 13.
    Dict Comprehension # python2.6 plantao = dict((c.uri, c) for c in conteudo_semantico) # python 3 plantao ={c.uri: c for c in conteudo_semantico}
  • 14.
    Set Comprehension vogais =set() for l in "minha frase": if l in "aeiou": vogais.add(l) vogais = {l for l in "minha frase" if l in "aeiou"}
  • 15.
    map(function, iterable) def c2f(c): return9.0/5.0*c + 32 c_temps = [39.2, 36.5, 37.3, 37.9] f_temps = map(c2f, c_temps) # [102.56, 97.7, 99.14, 100.22] --- ou --- f_temps = map(lambda c:9.0/5.0*c + 32, c_temps) map - executação uma função para cada elemento de uma lista
  • 16.
    filter(function, iterable) filter -filtra cada elemento da lista (deve retornar True or False) active_users = filter(lambda u: u.is_active(), users) excluded = filter(lambda u: u.email in blacklist, users)
  • 17.
    reduce(function, iterable) reduce -executa uma operação de redução de todos os valores para um único valor notas = [9, 8.5, 8.8, 9.1] maior_nota = reduce(lambda x, y: x if x > y else y, notas) # 9.1 depositos = [100, 130, 90] juros = 0.01 soma = reduce(lambda x, y: x * (1 + juros) + y, depositos)
  • 18.
    sorted(list, [key]) Ordena umalista sem alterar o original notas = [9, 8.5, 8.8, 9.1] sorted(notas) # [8.5, 8.8, 9, 9.1] sorted(notas, reverse=True) # [9.1, 9, 8.8, 8.5] produtos=[{"size":10, "cost":5}, {"size":12, "cost":9}, {"size":8, "cost":6}] sorted(produtos, key=lambda x: x["cost"])
  • 19.
    notas = [9,8.5, 8.8, 9.1, 8, 7, 4.3, 7.2] todos_aprovados = all([n >= 6 for n in notas]) tem_recuperacao = any([n < 6 for n in notas]) media_turma = sum(notas) / len(notas) maior_nota = max(notas) menor_nota = min(notas) aprovados = [n for n in notas if n >=6] media_aprovados = sum(aprovados) / len(aprovados) all(), any(), sum(), max(), min()
  • 20.
    Exemplos (1) Iniciando umvetor vetor = [0] * 10 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] Iniciando uma matrix nxm matriz = [[0 for i in xrange(m)] for j in xrange(n)] matriz[0][0] = 1
  • 21.
    Exemplos (2) lista=[1, 2,1, 3, 2, 1, 4, 2, 1, 1] max(set(lista), key=lista.count) Elemento que mais aparece numa lista FizzBuzz fizzbuzz = ["Fizz"*(i%3==0) + "Buzz"*(i%5==0) or str(i) for i in xrange(1, 100)]
  • 22.