57
Listas, Dicionários, Sets e outras Bestas Mitológicas --- Adriano Petrich

python: Listas, deques, Dicionarios e outros monstros mitologicos

Embed Size (px)

DESCRIPTION

Uma visita no que esta debaixo do capô de quando usamos listas, dicionarios e tal em python

Citation preview

Page 1: python: Listas, deques, Dicionarios e outros monstros mitologicos

Listas, Dicionários, Sets

e outras Bestas Mitológicas --- Adriano Petrich

Page 2: python: Listas, deques, Dicionarios e outros monstros mitologicos

O(n)?

Page 3: python: Listas, deques, Dicionarios e outros monstros mitologicos

Listas

Page 4: python: Listas, deques, Dicionarios e outros monstros mitologicos

Prós:Fantásticas

Page 5: python: Listas, deques, Dicionarios e outros monstros mitologicos

Listas

l = []

Page 6: python: Listas, deques, Dicionarios e outros monstros mitologicos

L.append(foo) é O(1)

Page 7: python: Listas, deques, Dicionarios e outros monstros mitologicos

L.pop() é O(1)

Page 8: python: Listas, deques, Dicionarios e outros monstros mitologicos

TáIsso não é tão fantástico

Page 9: python: Listas, deques, Dicionarios e outros monstros mitologicos

L[foo] = bar, L[foo] O(1)

Page 10: python: Listas, deques, Dicionarios e outros monstros mitologicos

Isso sim é fantástico

Page 11: python: Listas, deques, Dicionarios e outros monstros mitologicos

meh

Page 12: python: Listas, deques, Dicionarios e outros monstros mitologicos

ListasSe comportam como RAM porque sãomodeladas da mesma forma

Page 13: python: Listas, deques, Dicionarios e outros monstros mitologicos

CriaçãoUsa 20 bytes de overhead (classe, len,tamanho da alocação e posição)

Page 14: python: Listas, deques, Dicionarios e outros monstros mitologicos

masUma lista vazia não tem memória alocadapara os dados.

Page 15: python: Listas, deques, Dicionarios e outros monstros mitologicos

Quando

l.append(1)

Page 16: python: Listas, deques, Dicionarios e outros monstros mitologicos

Acontece a AlocaçãoAloca espaço para 4 elementos

Quando chega em 4 aloca espaço para 8 ecopia os 4

Depois 16

Page 17: python: Listas, deques, Dicionarios e outros monstros mitologicos

E assim por diante

Page 18: python: Listas, deques, Dicionarios e outros monstros mitologicos

Ou Quase25, 35, 46, 58, 72, 88

Page 19: python: Listas, deques, Dicionarios e outros monstros mitologicos

L.append(foo) é O(1)

Page 20: python: Listas, deques, Dicionarios e outros monstros mitologicos

Here be monsters

Page 21: python: Listas, deques, Dicionarios e outros monstros mitologicos

Cons

Page 22: python: Listas, deques, Dicionarios e outros monstros mitologicos

L.pop(0) é O(n)

Page 23: python: Listas, deques, Dicionarios e outros monstros mitologicos

L.pop(0) é O(n)-ish

Page 24: python: Listas, deques, Dicionarios e outros monstros mitologicos

Alternativa

from collections import dequedeque()

Page 25: python: Listas, deques, Dicionarios e outros monstros mitologicos

DequesDouble Ended QUEue

Internamente é uma lista ligada dupla

PrósFilas FIFO e não muito mais

Page 26: python: Listas, deques, Dicionarios e outros monstros mitologicos

De volta aslistas

Page 27: python: Listas, deques, Dicionarios e outros monstros mitologicos

foo in L é O(n)

Page 28: python: Listas, deques, Dicionarios e outros monstros mitologicos

Alternativas

set()

Page 29: python: Listas, deques, Dicionarios e outros monstros mitologicos

Dicionários

Page 30: python: Listas, deques, Dicionarios e outros monstros mitologicos

Dicionários?

>>> d = {}>>> d['a'] = 1

Page 31: python: Listas, deques, Dicionarios e outros monstros mitologicos

Interlúdio>>> hash('a')12416037344>>> bin(hash('a')'0b1011100100000011011011000111100000'

Page 32: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hashtable

Page 33: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hash 'a'

>>> hash('a')12416037344>>> bin(hash('a')'...000'

Page 34: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hashtable

Page 35: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hash 'b'

>>> d['b'] = 2>>> hash('b')12544037731>>> bin(hash('b')'...011'

Page 36: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hashtable

Page 37: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hash 'c'

>>> d['c'] = 3>>> hash('c')12672038114>>> bin(hash('c')'...010'

Page 38: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hashtable

Page 39: python: Listas, deques, Dicionarios e outros monstros mitologicos
Page 40: python: Listas, deques, Dicionarios e outros monstros mitologicos

Hash 'j'

>>> d['j'] = 4>>> hash('j')13568040811>>> bin(hash('j')'...011'

Page 41: python: Listas, deques, Dicionarios e outros monstros mitologicos

Enquanto isso naHashtable

Page 42: python: Listas, deques, Dicionarios e outros monstros mitologicos

Outra vez na Hashtable

Page 43: python: Listas, deques, Dicionarios e outros monstros mitologicos

Duas coisas

>>> d1 = {'a':1, 'j':4, 'b':2}>>> d2 = {'a':1, 'b':2, 'j':4}>>> d1{'a': 1, 'j': 4, 'b': 2}>>> d2{'a': 1, 'b': 2, 'j': 4}>>> d1 == d2True

Page 44: python: Listas, deques, Dicionarios e outros monstros mitologicos

Dicionários não temordemTem sim! A ordem da hashtable

>>> {'a':1, 'j':4, 'b':2}.keys()['a', 'j', 'b']>>> {'a':1, 'j':4, 'b':2}.values()[1, 4, 2]

Page 45: python: Listas, deques, Dicionarios e outros monstros mitologicos

Existem bem maissutilezasVídeo da pycon 2010: the might dictionary

Page 46: python: Listas, deques, Dicionarios e outros monstros mitologicos

Sets

Page 47: python: Listas, deques, Dicionarios e outros monstros mitologicos

SetsImplementação igual dos dicionários sóque sem o valor.

Então:

Page 48: python: Listas, deques, Dicionarios e outros monstros mitologicos

foo in s é O(1)

Page 49: python: Listas, deques, Dicionarios e outros monstros mitologicos

Grafos

Page 50: python: Listas, deques, Dicionarios e outros monstros mitologicos

A B

C D

Page 51: python: Listas, deques, Dicionarios e outros monstros mitologicos

A B

C D

Page 52: python: Listas, deques, Dicionarios e outros monstros mitologicos

Duas formas

a,b,c,d = range(4)n = [[0,1,1,0], [0,0,1,0], [0,0,0,1], [0,0,0,0]]

>>> n[a][b]1

Page 53: python: Listas, deques, Dicionarios e outros monstros mitologicos

Ou

n = { 'a': set('bc'), 'b': set('c'), 'c': set('d'), 'd': set()}

Python Patterns implementing graphs--Guido van Rossum

Page 54: python: Listas, deques, Dicionarios e outros monstros mitologicos

A B

C D

2

3 4

5

Page 55: python: Listas, deques, Dicionarios e outros monstros mitologicos

passe para dicionários

n = { 'a': {'b':2, 'c':3}, 'b': {'c':4}, 'c': {'d':5}, 'd': {}}

Page 56: python: Listas, deques, Dicionarios e outros monstros mitologicos

Créditoshttp://www.flickr.com/photos/autumn_bliss/414160195http://www.flickr.com/photos/autumn_bliss/414160148

Page 57: python: Listas, deques, Dicionarios e outros monstros mitologicos

Dúvidas?@fractal

+Adriano Petrich

[codando.com.br, sfp.adrianopetrich.com,blog.adrianopetrich.com]