Listas, Dicionários, Sets




e outras Bestas Mitológicas --- Adriano Petrich
O(n)?
Listas
Prós:
  Fantásticas
Listas
l = []
L.append(foo) é O(1)
L.pop() é O(1)
Tá
Isso não é tão fantástico
L[foo] = bar, L[foo] O(1)
Isso sim é fantástico
meh
Listas
Se comportam como RAM porque são
modeladas da mesma forma
Criação
Usa 20 bytes de overhead (classe, len,
tamanho da alocação e posição)
mas
Uma lista vazia não tem memória alocada
para os dados.
Quando
l.append(1)
Acontece a Alocação
Aloca espaço para 4 elementos
Quando chega em 4 aloca espaço para 8 e
copia os 4
Depois 16
E assim por diante
Ou Quase
25, 35, 46, 58, 72, 88
L.append(foo) é O(1)
Here be monsters
Cons
L.pop(0) é O(n)
L.pop(0) é O(n)-ish
Alternativa
from collections import deque
deque()
Deques
Double Ended QUEue
Internamente é uma lista ligada dupla

Prós
Filas FIFO e não muito mais
De volta as
listas
foo in L é O(n)
Alternativas
set()
Dicionários
Dicionários?
>>> d = {}
>>> d['a'] = 1
Interlúdio
>>> hash('a')
12416037344
>>> bin(hash('a')
'0b1011100100000011011011000111100000'
Hashtable
Hash 'a'
>>> hash('a')
12416037344
>>> bin(hash('a')
'...000'
Hashtable
Hash 'b'
>>> d['b'] = 2
>>> hash('b')
12544037731
>>> bin(hash('b')
'...011'
Hashtable
Hash 'c'
>>> d['c'] = 3
>>> hash('c')
12672038114
>>> bin(hash('c')
'...010'
Hashtable
Hash 'j'
>>> d['j'] = 4
>>> hash('j')
13568040811
>>> bin(hash('j')
'...011'
Enquanto isso na
Hashtable
Outra vez na Hashtable
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 == d2
True
Dicionários não tem
ordem
Tem 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]
Existem bem mais
sutilezas
Vídeo da pycon 2010: the might dictionary
Sets
Sets
Implementação igual dos dicionários só
que sem o valor.
Então:
foo in s é O(1)
Grafos
A   B


C   D
A   B


C   D
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
Ou
 n = { 'a':   set('bc'),
       'b':   set('c'),
       'c':   set('d'),
       'd':   set()}

Python Patterns implementing   graphs
--Guido van Rossum
2
A       B
3   4

C   5   D
passe para dicionários
n = { 'a':   {'b':2, 'c':3},
      'b':   {'c':4},
      'c':   {'d':5},
      'd':   {}}
Créditos
http://www.flickr.com/photos/autumn_bliss/414160195
http://www.flickr.com/photos/autumn_bliss/414160148
Dúvidas?
@fractal
+Adriano Petrich
[codando.com.br, sfp.adrianopetrich.com,
blog.adrianopetrich.com]

python: Listas, deques, Dicionarios e outros monstros mitologicos