SlideShare a Scribd company logo
Lightning Talk
collections
André Ericson
Dezembro/2011, Pug-Pe
collections
Roteiro




    • Counter
    • deque
    • namedtuple
    • OrderedDict
    • abc
    • collections.abc
collections.Counter
Counter


          >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])
          >>> print c
          Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

          # Funciona como um dicionario
          >>> print c[’a’]
          2
          >>> c[’a’] += 1
          >>> print c
          Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

          >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError
          0

          >>> c.most_common(3)
          [(’a’, 3), (’b’, 2), (’d’, 2)]
          >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})
          >>> c[’f’] > c[’a’]
          True

          >>> c.update([’a’, ’b’, ’b’, ’d’])
          # c.subtract(iterable-or-mapping) faz o subtracao de elementos
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
Counter


          >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])
          >>> print c
          Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

          # Funciona como um dicionario
          >>> print c[’a’]
          2
          >>> c[’a’] += 1
          >>> print c
          Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

          >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError
          0

          >>> c.most_common(3)
          [(’a’, 3), (’b’, 2), (’d’, 2)]
          >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})
          >>> c[’f’] > c[’a’]
          True

          >>> c.update([’a’, ’b’, ’b’, ’d’])
          # c.subtract(iterable-or-mapping) faz o subtracao de elementos
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
Counter


          >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])
          >>> print c
          Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

          # Funciona como um dicionario
          >>> print c[’a’]
          2
          >>> c[’a’] += 1
          >>> print c
          Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

          >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError
          0

          >>> c.most_common(3)
          [(’a’, 3), (’b’, 2), (’d’, 2)]
          >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})
          >>> c[’f’] > c[’a’]
          True

          >>> c.update([’a’, ’b’, ’b’, ’d’])
          # c.subtract(iterable-or-mapping) faz o subtracao de elementos
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
Counter


          >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])
          >>> print c
          Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

          # Funciona como um dicionario
          >>> print c[’a’]
          2
          >>> c[’a’] += 1
          >>> print c
          Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

          >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError
          0

          >>> c.most_common(3)
          [(’a’, 3), (’b’, 2), (’d’, 2)]
          >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})
          >>> c[’f’] > c[’a’]
          True

          >>> c.update([’a’, ’b’, ’b’, ’d’])
          # c.subtract(iterable-or-mapping) faz o subtracao de elementos
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
Counter


          >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’])
          >>> print c
          Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1})

          # Funciona como um dicionario
          >>> print c[’a’]
          2
          >>> c[’a’] += 1
          >>> print c
          Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})

          >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError
          0

          >>> c.most_common(3)
          [(’a’, 3), (’b’, 2), (’d’, 2)]
          >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1})
          >>> c[’f’] > c[’a’]
          True

          >>> c.update([’a’, ’b’, ’b’, ’d’])
          # c.subtract(iterable-or-mapping) faz o subtracao de elementos
          >>> print c
          Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
Counter: Exemplo

  import re
  from collections import Counter
  LANGUAGES = [
      "C", "C++", "Java", "PHP", "Ruby", "C#",
      "JavaScript", "Perl", "Python"
  ]

  swear_book = [
      ’shit’, ’piss’, ’fuck’,
      ’cock’, ’motherfucker’,                                    Counter({’C++’: 67, ’Ruby’: 64,
  ]                                                                      ’JavaScript’: 55, ’C’: 39,
                                                                         ’Perl’: 33, ’C#’: 29,
  lang_count = Counter()                                                 ’Java’: 23, ’Python’: 15,
  swear_count = Counter()                                                ’PHP’: 11})
                                                                 Counter({’shit’: 213, ’fuck’: 112,
  for lang in LANGUAGES:                                                 ’piss’: 5, ’cock’: 4,
      with open(’language-commits[’ + lang +                             ’motherfucker’: 2})
                  ’].yml’) as f:
          words = re.findall(’w+’, f.read().lower())
          for fu in words:
              if fu in swear_book:
                  lang_count[lang] += 1
                  swear_count[fu] += 1

  print lang_count
  print swear_count
                            data from: https://github.com/AndrewVos/github-statistics
collections.deque
deque




img: http://www.webreference.com
deque




  • lists são lentas para pop(0) e insert(0, v) --> O(n)
  • deque pop e insert no fim ou no início com O(1)
  • deque não substitui list
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque



  >>> d = deque([1,2,3])
  >>> print d
  deque([1, 2, 3])

  >>> d.append(4)
  >>> print d
  deque([1, 2, 3, 4])        >>> d.rotate(1) # Rotaciona a direita
                             >>> print d
  >>> d.appendleft(5)        deque([9, 1, 3, 7, 8])
  >>> print d
  deque([5, 1, 2, 3, 4])     >>> d = deque([1,2,3], maxlen=3)
                             >>> print d
  >>> d.pop(), d.popleft()   deque([1, 2, 3], maxlen=3)
  (4, 5)                     >>> d.append(4)
  >>> del d[1]               deque([2, 3, 4], maxlen=3)
  >>> print d
  deque([1, 3])

  >>> d.extend([7, 8, 9])
  >>> print d
  deque([1, 3, 7, 8, 9])
deque vs list


   num =   100000
   print   u"Tempo para insercao no inicio:"
   print   "Deque:",
   print   timeit.Timer(’dq.appendleft("abc")’,
                         ’from collections import deque;’+
                        ’dq = deque()’).timeit(number=num)
   print   "List:",
   print   timeit.Timer(’li.insert(0, "abc")’,
                         ’li =[]’).timeit(number=num)       Tempo para insercao no inicio:
   print   "Tempo para pop(0):"                             Deque: 0.0206291675568
   print   "Deque:",                                        List: 5.03016710281
   print   timeit.Timer(’dq.popleft()’,                     ----------
                       ’from collections import deque;’+    Tempo para pop(0):
                        ’dq = deque(range(%i))’ % num       Deque: 0.0202388763428
                       ).timeit(number=num)                 List: 3.49450302124
   print   "List:",                                         ----------
   print   timeit.Timer(’li.pop(0)’,                        Tempo de acesso ao meio:
                         ’li = range(%i)’ % num             Deque: 4.97369003296
                       ).timeit(number=num)                 List: 0.051794052124
   print   "Tempo de acesso ao meio:"
   print   "Deque:",
   print   timeit.Timer(’dq[meio]’, ’from collections import deque;’+
                                    ’dq = deque(range(%i));’ % num +
                                    ’meio = len(dq)/2’).timeit()
   print   "List:",
   print   timeit.Timer(’li[meio]’, ’li = range(%i);’ % num +
                                    ’meio = len(li)/2’).timeit()
collections.namedtuple
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
namedtuple



             >>> Point = namedtuple(’Point’, [’x’, ’y’])
             >>> p = Point(2, 3)
             >>> print p.x, p.y
             2 3

             >>> print p[0:2]
             (2, 3)
             >>> print p.count(2) # herda metodos de tuple
             1

             >>> Point._make([1,2])
             Point(x=1, y=2)

             >>> p._asdict()
             OrderedDict([(’x’, 2), (’y’, 3)])

             >>> p._replace(x=77)
             Point(x=77, y=3)

             >>> p._fields
             (’x’, ’y’)
collections.OrderedDict
OrderedDict




              >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}
              >>> print d
              {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

              >>> print OrderedDict(sorted(d.items()))
              OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

              >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

              >>> od.popitem()
              (’apple’, 4)
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
OrderedDict




              >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}
              >>> print d
              {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

              >>> print OrderedDict(sorted(d.items()))
              OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

              >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

              >>> od.popitem()
              (’apple’, 4)
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
OrderedDict




              >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}
              >>> print d
              {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

              >>> print OrderedDict(sorted(d.items()))
              OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

              >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

              >>> od.popitem()
              (’apple’, 4)
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
OrderedDict




              >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2}
              >>> print d
              {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4}

              >>> print OrderedDict(sorted(d.items()))
              OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)])

              >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1]))
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)])

              >>> od.popitem()
              (’apple’, 4)
              >>> print od
              OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
collections.abc
  ABC - Abstract Base Class
abc em 2 minutos



            class AbstractKnight(object):

               __metaclass__ = abc.ABCMeta
               @abc.abstractmethod
               def echo(self):
                   pass

            class IncompKnight(AbstractKnight):
                pass

            >>> IncompKnight()
            TypeError: Can’t instantiate abstract class IncompKnight
            with abstract methods echo

            >>> AbstractKnight.__abstractmethods__
            frozenset([’echo’])

            class KnightImp(AbstractKnight):
                def echo(self):
                    print ’Ni’
            >>> KnightImp().echo()
            Ni
abc em 2 minutos



            class AbstractKnight(object):

               __metaclass__ = abc.ABCMeta
               @abc.abstractmethod
               def echo(self):
                   pass

            class IncompKnight(AbstractKnight):
                pass

            >>> IncompKnight()
            TypeError: Can’t instantiate abstract class IncompKnight
            with abstract methods echo

            >>> AbstractKnight.__abstractmethods__
            frozenset([’echo’])

            class KnightImp(AbstractKnight):
                def echo(self):
                    print ’Ni’
            >>> KnightImp().echo()
            Ni
abc em 2 minutos



            class AbstractKnight(object):

               __metaclass__ = abc.ABCMeta
               @abc.abstractmethod
               def echo(self):
                   pass

            class IncompKnight(AbstractKnight):
                pass

            >>> IncompKnight()
            TypeError: Can’t instantiate abstract class IncompKnight
            with abstract methods echo

            >>> AbstractKnight.__abstractmethods__
            frozenset([’echo’])

            class KnightImp(AbstractKnight):
                def echo(self):
                    print ’Ni’
            >>> KnightImp().echo()
            Ni
abc em 2 minutos



            class AbstractKnight(object):

               __metaclass__ = abc.ABCMeta
               @abc.abstractmethod
               def echo(self):
                   pass

            class IncompKnight(AbstractKnight):
                pass

            >>> IncompKnight()
            TypeError: Can’t instantiate abstract class IncompKnight
            with abstract methods echo

            >>> AbstractKnight.__abstractmethods__
            frozenset([’echo’])

            class KnightImp(AbstractKnight):
                def echo(self):
                    print ’Ni’
            >>> KnightImp().echo()
            Ni
abc em 2 minutos



            class AbstractKnight(object):

               __metaclass__ = abc.ABCMeta
               @abc.abstractmethod
               def echo(self):
                   pass

            class IncompKnight(AbstractKnight):
                pass

            >>> IncompKnight()
            TypeError: Can’t instantiate abstract class IncompKnight
            with abstract methods echo

            >>> AbstractKnight.__abstractmethods__
            frozenset([’echo’])

            class KnightImp(AbstractKnight):
                def echo(self):
                    print ’Ni’
            >>> KnightImp().echo()
            Ni
Herdando dict




            class Dicto(dict):
                def __getitem__(self, k):
                    return 31

            >>> d = Dicto()
            >>> d[2]
            31

            >>> print d.get(2)
            None

            D’oh : (
Herdando dict




            class Dicto(dict):
                def __getitem__(self, k):
                    return 31

            >>> d = Dicto()
            >>> d[2]
            31

            >>> print d.get(2)
            None

            D’oh : (
Herdando dict




            class Dicto(dict):
                def __getitem__(self, k):
                    return 31

            >>> d = Dicto()
            >>> d[2]
            31

            >>> print d.get(2)
            None

            D’oh : (
collections.abc




   • subclasses de builtin containers nem sempre produzem resultados
    esperados
   • subclasses de ABC produzem
collections.abc
if you’re lazy



                                                    Callable -> [’__call__’]
                                                    Container -> [’__contains__’]
                                                    Hashable -> [’__hash__’]
                                                    ItemsView -> []
                                                    Iterable -> [’__iter__’]
     # ex: MutableMapping.__abstractmethods__       Iterator -> [’next’]
     for i in dir(collections):                     KeysView -> []
         try:                                       Mapping -> [’__iter__’, ’__getitem__’, ’__len__’]
              meths = list(getattr(collections, i   MappingView -> []
                          ).__abstractmethods__)    MutableMapping -> [’__delitem__’, ’__setitem__’,
              print i, ’->’, meths                                   ’__getitem__’, ’__iter__’, ’__len__’]
         except:                                    MutableSequence -> [’__delitem__’, ’__setitem__’,
              pass                                                   ’__getitem__’, ’__len__’, ’insert’]
                                                    MutableSet -> [’discard’, ’add’, ’__iter__’,
                                                                     ’__len__’, ’__contains__’]
                                                    Sequence -> [’__getitem__’, ’__len__’]
                                                    Set -> [’__iter__’, ’__len__’, ’__contains__’]
                                                    Sized -> [’__len__’]
                                                    ValuesView -> []
Subclassing dict de
collections.MutableMapping


    from collections import MutableMapping

    class Dicto(MutableMapping):

       def __init__(self):
           self.d = {}                       >>> d = Dicto()
                                             >>> d[’eggs’] = ’ovos’
       def __delitem__(self, i):             >>> d[’ham’] = ’presunto’
           del self.d[i]                     >>> for i in d:
                                             ...    print i + ’:’ + d[i]
       def __setitem__(self, k, v):          eggs:ovos
           self.d[k.lower()] = v             ham:presunto
                                             >>> d.get(’HaM’)
       def __getitem__(self, k):             presunto
           return self.d[k.lower()]          >>> d[’eGGs’]
                                             ’ovos’
       def __iter__(self):
           return iter(self.d)

       def __len__(self):
           return len(self.d)
Subclassing dict de
collections.MutableMapping


    from collections import MutableMapping

    class Dicto(MutableMapping):

       def __init__(self):
           self.d = {}                       >>> d = Dicto()
                                             >>> d[’eggs’] = ’ovos’
       def __delitem__(self, i):             >>> d[’ham’] = ’presunto’
           del self.d[i]                     >>> for i in d:
                                             ...    print i + ’:’ + d[i]
       def __setitem__(self, k, v):          eggs:ovos
           self.d[k.lower()] = v             ham:presunto
                                             >>> d.get(’HaM’)
       def __getitem__(self, k):             presunto
           return self.d[k.lower()]          >>> d[’eGGs’]
                                             ’ovos’
       def __iter__(self):
           return iter(self.d)

       def __len__(self):
           return len(self.d)
Referência


  • Lightning Talk de:




    no fisl 2011.
  • The Data Structures of Python, Alex Gaynor no PyCon2011
  • http://www.doughellmann.com/PyMOTW/abc/index.html
  • http://docs.python.org/library/collections.html
Dúvidas?




                     André Ericson
           http://www.github.com/aericson
                de.ericson@gmail.com
                      @_aericson

More Related Content

PDF
Clustering com numpy e cython
PDF
PLOTCON NYC: Behind Every Great Plot There's a Great Deal of Wrangling
PDF
Elixir & Phoenix – fast, concurrent and explicit
PDF
Elixir & Phoenix – fast, concurrent and explicit
PDF
How fast ist it really? Benchmarking in practice
PDF
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
PDF
Frege is a Haskell for the JVM
PDF
Pre-Bootcamp introduction to Elixir
Clustering com numpy e cython
PLOTCON NYC: Behind Every Great Plot There's a Great Deal of Wrangling
Elixir & Phoenix – fast, concurrent and explicit
Elixir & Phoenix – fast, concurrent and explicit
How fast ist it really? Benchmarking in practice
{tidytext}と{RMeCab}によるモダンな日本語テキスト分析
Frege is a Haskell for the JVM
Pre-Bootcamp introduction to Elixir

What's hot (20)

PDF
令和から本気出す
PDF
Codigos
PDF
python高级内存管理
PDF
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
PPTX
The groovy puzzlers (as Presented at JavaOne 2014)
PDF
밑바닥부터 시작하는 의료 AI
PPTX
PDF
Taking Perl to Eleven with Higher-Order Functions
PDF
{shiny}と{leaflet}による地図アプリ開発Tips
PDF
Lập trình Python cơ bản
PPT
An Elephant of a Different Colour: Hack
DOCX
ggplot2 extensions-ggtree.
PDF
Groovy collection api
PDF
جلسه سوم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲
ODP
PDF
Intro to OTP in Elixir
PDF
Functional Pe(a)rls - the Purely Functional Datastructures edition
PDF
Python for High School Programmers
KEY
Introduction to Groovy
令和から本気出す
Codigos
python高级内存管理
{tidygraph}と{ggraph}による モダンなネットワーク分析(未公開ver)
The groovy puzzlers (as Presented at JavaOne 2014)
밑바닥부터 시작하는 의료 AI
Taking Perl to Eleven with Higher-Order Functions
{shiny}と{leaflet}による地図アプリ開発Tips
Lập trình Python cơ bản
An Elephant of a Different Colour: Hack
ggplot2 extensions-ggtree.
Groovy collection api
جلسه سوم پایتون برای هکر های قانونی دوره مقدماتی پاییز ۹۲
Intro to OTP in Elixir
Functional Pe(a)rls - the Purely Functional Datastructures edition
Python for High School Programmers
Introduction to Groovy
Ad

Viewers also liked (20)

PDF
Apresentando o I Toró de Palestras do PUG-PE
PPT
Pyjamas: Uma Ferramenta Pythônica para Web
PDF
Coding Dojo e Test Driven Development
PDF
Python na formacao_de_jovens
PDF
Peça seu código em casamento: Votos, Tópicos e TDD
PDF
Python e Cadeias de Markov GHMM
ODP
(entregando djangoapps)@tangerinalab - pugpe xv
PDF
PDF
Rain Toolbox - Previsão de Chuvas
PPT
Blender Com Python
PDF
Criando comunidades bem sucedidas
PDF
Wikilytics
PDF
Computação Científica com Python
PDF
Migrando do App Engine para o Heroku
PDF
Qml + Python
PPT
PPTX
Arduino e python
PDF
NoSQL com Cassandra e Python
PPTX
Palestra sobre Inteligência Coletiva
ODP
REST APIs com Django
Apresentando o I Toró de Palestras do PUG-PE
Pyjamas: Uma Ferramenta Pythônica para Web
Coding Dojo e Test Driven Development
Python na formacao_de_jovens
Peça seu código em casamento: Votos, Tópicos e TDD
Python e Cadeias de Markov GHMM
(entregando djangoapps)@tangerinalab - pugpe xv
Rain Toolbox - Previsão de Chuvas
Blender Com Python
Criando comunidades bem sucedidas
Wikilytics
Computação Científica com Python
Migrando do App Engine para o Heroku
Qml + Python
Arduino e python
NoSQL com Cassandra e Python
Palestra sobre Inteligência Coletiva
REST APIs com Django
Ad

Similar to Palestra sobre Collections com Python (20)

PDF
Τα Πολύ Βασικά για την Python
PDF
Useful javascript
PDF
An overview of Python 2.7
PDF
A tour of Python
PDF
PPTX
R programming language
PDF
Functions in python
PDF
Beautiful python - PyLadies
PDF
Extending Operators in Perl with Operator::Util
PPTX
Python 101++: Let's Get Down to Business!
PPTX
Python 표준 라이브러리
PDF
PDF
Learn 90% of Python in 90 Minutes
PDF
[1062BPY12001] Data analysis with R / week 2
PPTX
Pythonlearn-08-Lists (1).pptxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
PPTX
R programming
PPTX
Python 내장 함수
ODP
Python course Day 1
PDF
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
PDF
Optimization and Mathematical Programming in R and ROI - R Optimization Infra...
Τα Πολύ Βασικά για την Python
Useful javascript
An overview of Python 2.7
A tour of Python
R programming language
Functions in python
Beautiful python - PyLadies
Extending Operators in Perl with Operator::Util
Python 101++: Let's Get Down to Business!
Python 표준 라이브러리
Learn 90% of Python in 90 Minutes
[1062BPY12001] Data analysis with R / week 2
Pythonlearn-08-Lists (1).pptxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
R programming
Python 내장 함수
Python course Day 1
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Optimization and Mathematical Programming in R and ROI - R Optimization Infra...

More from pugpe (17)

PPT
Projeto Amadeus
PDF
E o que danado é o PUG-PE?
PDF
Intro
PDF
Construindo uma startup em 54 horas com Python
PDF
Automatizando tarefas com Python
PDF
Visualização da Informação
PPTX
Desenvolvendo aplicativos web com o google app engine
PPTX
Pip - Instalando Pacotes facilmente para Python
PPTX
Pug pe vii - luciano rodrigues - debugger
PPTX
Pug pe viii - luciano rodrigues - debugger
PPT
Python e Django
PDF
Python e Dispositivos Móveis
PDF
Redes Neurais e Python
PPTX
CATS: Sistema de Recomendação de Eventos
PDF
Python Funcional
PPT
Open Allure
PDF
Iron Python
Projeto Amadeus
E o que danado é o PUG-PE?
Intro
Construindo uma startup em 54 horas com Python
Automatizando tarefas com Python
Visualização da Informação
Desenvolvendo aplicativos web com o google app engine
Pip - Instalando Pacotes facilmente para Python
Pug pe vii - luciano rodrigues - debugger
Pug pe viii - luciano rodrigues - debugger
Python e Django
Python e Dispositivos Móveis
Redes Neurais e Python
CATS: Sistema de Recomendação de Eventos
Python Funcional
Open Allure
Iron Python

Recently uploaded (20)

PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Encapsulation theory and applications.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
sap open course for s4hana steps from ECC to s4
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Approach and Philosophy of On baking technology
PDF
Empathic Computing: Creating Shared Understanding
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Dropbox Q2 2025 Financial Results & Investor Presentation
Encapsulation theory and applications.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
sap open course for s4hana steps from ECC to s4
The AUB Centre for AI in Media Proposal.docx
MIND Revenue Release Quarter 2 2025 Press Release
Understanding_Digital_Forensics_Presentation.pptx
Approach and Philosophy of On baking technology
Empathic Computing: Creating Shared Understanding
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
NewMind AI Weekly Chronicles - August'25 Week I
Reach Out and Touch Someone: Haptics and Empathic Computing
Spectral efficient network and resource selection model in 5G networks
Encapsulation_ Review paper, used for researhc scholars
Per capita expenditure prediction using model stacking based on satellite ima...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Big Data Technologies - Introduction.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
“AI and Expert System Decision Support & Business Intelligence Systems”
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...

Palestra sobre Collections com Python

  • 2. collections Roteiro • Counter • deque • namedtuple • OrderedDict • abc • collections.abc
  • 4. Counter >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’]) >>> print c Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1}) # Funciona como um dicionario >>> print c[’a’] 2 >>> c[’a’] += 1 >>> print c Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError 0 >>> c.most_common(3) [(’a’, 3), (’b’, 2), (’d’, 2)] >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa >>> print c Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> c[’f’] > c[’a’] True >>> c.update([’a’, ’b’, ’b’, ’d’]) # c.subtract(iterable-or-mapping) faz o subtracao de elementos >>> print c Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
  • 5. Counter >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’]) >>> print c Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1}) # Funciona como um dicionario >>> print c[’a’] 2 >>> c[’a’] += 1 >>> print c Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError 0 >>> c.most_common(3) [(’a’, 3), (’b’, 2), (’d’, 2)] >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa >>> print c Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> c[’f’] > c[’a’] True >>> c.update([’a’, ’b’, ’b’, ’d’]) # c.subtract(iterable-or-mapping) faz o subtracao de elementos >>> print c Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
  • 6. Counter >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’]) >>> print c Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1}) # Funciona como um dicionario >>> print c[’a’] 2 >>> c[’a’] += 1 >>> print c Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError 0 >>> c.most_common(3) [(’a’, 3), (’b’, 2), (’d’, 2)] >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa >>> print c Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> c[’f’] > c[’a’] True >>> c.update([’a’, ’b’, ’b’, ’d’]) # c.subtract(iterable-or-mapping) faz o subtracao de elementos >>> print c Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
  • 7. Counter >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’]) >>> print c Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1}) # Funciona como um dicionario >>> print c[’a’] 2 >>> c[’a’] += 1 >>> print c Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError 0 >>> c.most_common(3) [(’a’, 3), (’b’, 2), (’d’, 2)] >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa >>> print c Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> c[’f’] > c[’a’] True >>> c.update([’a’, ’b’, ’b’, ’d’]) # c.subtract(iterable-or-mapping) faz o subtracao de elementos >>> print c Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
  • 8. Counter >>> c = Counter([’a’, ’b’, ’c’, ’d’, ’a’, ’d’, ’b’]) >>> print c Counter({’a’: 2, ’b’: 2, ’d’: 2, ’c’: 1}) # Funciona como um dicionario >>> print c[’a’] 2 >>> c[’a’] += 1 >>> print c Counter({’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> print c[’e’] # Retorna 0 ao inves de levantar KeyError 0 >>> c.most_common(3) [(’a’, 3), (’b’, 2), (’d’, 2)] >>> c[’f’] = ’asdad’ # Pode adicionar qualquer coisa >>> print c Counter({’f’: ’asdad’, ’a’: 3, ’b’: 2, ’d’: 2, ’c’: 1}) >>> c[’f’] > c[’a’] True >>> c.update([’a’, ’b’, ’b’, ’d’]) # c.subtract(iterable-or-mapping) faz o subtracao de elementos >>> print c Counter({’f’: ’asdad’, ’a’: 4, ’b’: 4, ’d’: 3, ’c’: 1})
  • 9. Counter: Exemplo import re from collections import Counter LANGUAGES = [ "C", "C++", "Java", "PHP", "Ruby", "C#", "JavaScript", "Perl", "Python" ] swear_book = [ ’shit’, ’piss’, ’fuck’, ’cock’, ’motherfucker’, Counter({’C++’: 67, ’Ruby’: 64, ] ’JavaScript’: 55, ’C’: 39, ’Perl’: 33, ’C#’: 29, lang_count = Counter() ’Java’: 23, ’Python’: 15, swear_count = Counter() ’PHP’: 11}) Counter({’shit’: 213, ’fuck’: 112, for lang in LANGUAGES: ’piss’: 5, ’cock’: 4, with open(’language-commits[’ + lang + ’motherfucker’: 2}) ’].yml’) as f: words = re.findall(’w+’, f.read().lower()) for fu in words: if fu in swear_book: lang_count[lang] += 1 swear_count[fu] += 1 print lang_count print swear_count data from: https://github.com/AndrewVos/github-statistics
  • 12. deque • lists são lentas para pop(0) e insert(0, v) --> O(n) • deque pop e insert no fim ou no início com O(1) • deque não substitui list
  • 13. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 14. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 15. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 16. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 17. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 18. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 19. deque >>> d = deque([1,2,3]) >>> print d deque([1, 2, 3]) >>> d.append(4) >>> print d deque([1, 2, 3, 4]) >>> d.rotate(1) # Rotaciona a direita >>> print d >>> d.appendleft(5) deque([9, 1, 3, 7, 8]) >>> print d deque([5, 1, 2, 3, 4]) >>> d = deque([1,2,3], maxlen=3) >>> print d >>> d.pop(), d.popleft() deque([1, 2, 3], maxlen=3) (4, 5) >>> d.append(4) >>> del d[1] deque([2, 3, 4], maxlen=3) >>> print d deque([1, 3]) >>> d.extend([7, 8, 9]) >>> print d deque([1, 3, 7, 8, 9])
  • 20. deque vs list num = 100000 print u"Tempo para insercao no inicio:" print "Deque:", print timeit.Timer(’dq.appendleft("abc")’, ’from collections import deque;’+ ’dq = deque()’).timeit(number=num) print "List:", print timeit.Timer(’li.insert(0, "abc")’, ’li =[]’).timeit(number=num) Tempo para insercao no inicio: print "Tempo para pop(0):" Deque: 0.0206291675568 print "Deque:", List: 5.03016710281 print timeit.Timer(’dq.popleft()’, ---------- ’from collections import deque;’+ Tempo para pop(0): ’dq = deque(range(%i))’ % num Deque: 0.0202388763428 ).timeit(number=num) List: 3.49450302124 print "List:", ---------- print timeit.Timer(’li.pop(0)’, Tempo de acesso ao meio: ’li = range(%i)’ % num Deque: 4.97369003296 ).timeit(number=num) List: 0.051794052124 print "Tempo de acesso ao meio:" print "Deque:", print timeit.Timer(’dq[meio]’, ’from collections import deque;’+ ’dq = deque(range(%i));’ % num + ’meio = len(dq)/2’).timeit() print "List:", print timeit.Timer(’li[meio]’, ’li = range(%i);’ % num + ’meio = len(li)/2’).timeit()
  • 22. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 23. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 24. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 25. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 26. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 27. namedtuple >>> Point = namedtuple(’Point’, [’x’, ’y’]) >>> p = Point(2, 3) >>> print p.x, p.y 2 3 >>> print p[0:2] (2, 3) >>> print p.count(2) # herda metodos de tuple 1 >>> Point._make([1,2]) Point(x=1, y=2) >>> p._asdict() OrderedDict([(’x’, 2), (’y’, 3)]) >>> p._replace(x=77) Point(x=77, y=3) >>> p._fields (’x’, ’y’)
  • 29. OrderedDict >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2} >>> print d {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4} >>> print OrderedDict(sorted(d.items())) OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)]) >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1])) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)]) >>> od.popitem() (’apple’, 4) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
  • 30. OrderedDict >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2} >>> print d {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4} >>> print OrderedDict(sorted(d.items())) OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)]) >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1])) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)]) >>> od.popitem() (’apple’, 4) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
  • 31. OrderedDict >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2} >>> print d {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4} >>> print OrderedDict(sorted(d.items())) OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)]) >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1])) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)]) >>> od.popitem() (’apple’, 4) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
  • 32. OrderedDict >>> d = {’banana’: 3, ’apple’:4, ’pear’: 1, ’orange’: 2} >>> print d {’orange’: 2, ’pear’: 1, ’banana’: 3, ’apple’: 4} >>> print OrderedDict(sorted(d.items())) OrderedDict([(’apple’, 4), (’banana’, 3), (’orange’, 2), (’pear’, 1)]) >>> od = OrderedDict(sorted(d.items(), key=lambda k: k[1])) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3), (’apple’, 4)]) >>> od.popitem() (’apple’, 4) >>> print od OrderedDict([(’pear’, 1), (’orange’, 2), (’banana’, 3)])
  • 33. collections.abc ABC - Abstract Base Class
  • 34. abc em 2 minutos class AbstractKnight(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def echo(self): pass class IncompKnight(AbstractKnight): pass >>> IncompKnight() TypeError: Can’t instantiate abstract class IncompKnight with abstract methods echo >>> AbstractKnight.__abstractmethods__ frozenset([’echo’]) class KnightImp(AbstractKnight): def echo(self): print ’Ni’ >>> KnightImp().echo() Ni
  • 35. abc em 2 minutos class AbstractKnight(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def echo(self): pass class IncompKnight(AbstractKnight): pass >>> IncompKnight() TypeError: Can’t instantiate abstract class IncompKnight with abstract methods echo >>> AbstractKnight.__abstractmethods__ frozenset([’echo’]) class KnightImp(AbstractKnight): def echo(self): print ’Ni’ >>> KnightImp().echo() Ni
  • 36. abc em 2 minutos class AbstractKnight(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def echo(self): pass class IncompKnight(AbstractKnight): pass >>> IncompKnight() TypeError: Can’t instantiate abstract class IncompKnight with abstract methods echo >>> AbstractKnight.__abstractmethods__ frozenset([’echo’]) class KnightImp(AbstractKnight): def echo(self): print ’Ni’ >>> KnightImp().echo() Ni
  • 37. abc em 2 minutos class AbstractKnight(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def echo(self): pass class IncompKnight(AbstractKnight): pass >>> IncompKnight() TypeError: Can’t instantiate abstract class IncompKnight with abstract methods echo >>> AbstractKnight.__abstractmethods__ frozenset([’echo’]) class KnightImp(AbstractKnight): def echo(self): print ’Ni’ >>> KnightImp().echo() Ni
  • 38. abc em 2 minutos class AbstractKnight(object): __metaclass__ = abc.ABCMeta @abc.abstractmethod def echo(self): pass class IncompKnight(AbstractKnight): pass >>> IncompKnight() TypeError: Can’t instantiate abstract class IncompKnight with abstract methods echo >>> AbstractKnight.__abstractmethods__ frozenset([’echo’]) class KnightImp(AbstractKnight): def echo(self): print ’Ni’ >>> KnightImp().echo() Ni
  • 39. Herdando dict class Dicto(dict): def __getitem__(self, k): return 31 >>> d = Dicto() >>> d[2] 31 >>> print d.get(2) None D’oh : (
  • 40. Herdando dict class Dicto(dict): def __getitem__(self, k): return 31 >>> d = Dicto() >>> d[2] 31 >>> print d.get(2) None D’oh : (
  • 41. Herdando dict class Dicto(dict): def __getitem__(self, k): return 31 >>> d = Dicto() >>> d[2] 31 >>> print d.get(2) None D’oh : (
  • 42. collections.abc • subclasses de builtin containers nem sempre produzem resultados esperados • subclasses de ABC produzem
  • 44. if you’re lazy Callable -> [’__call__’] Container -> [’__contains__’] Hashable -> [’__hash__’] ItemsView -> [] Iterable -> [’__iter__’] # ex: MutableMapping.__abstractmethods__ Iterator -> [’next’] for i in dir(collections): KeysView -> [] try: Mapping -> [’__iter__’, ’__getitem__’, ’__len__’] meths = list(getattr(collections, i MappingView -> [] ).__abstractmethods__) MutableMapping -> [’__delitem__’, ’__setitem__’, print i, ’->’, meths ’__getitem__’, ’__iter__’, ’__len__’] except: MutableSequence -> [’__delitem__’, ’__setitem__’, pass ’__getitem__’, ’__len__’, ’insert’] MutableSet -> [’discard’, ’add’, ’__iter__’, ’__len__’, ’__contains__’] Sequence -> [’__getitem__’, ’__len__’] Set -> [’__iter__’, ’__len__’, ’__contains__’] Sized -> [’__len__’] ValuesView -> []
  • 45. Subclassing dict de collections.MutableMapping from collections import MutableMapping class Dicto(MutableMapping): def __init__(self): self.d = {} >>> d = Dicto() >>> d[’eggs’] = ’ovos’ def __delitem__(self, i): >>> d[’ham’] = ’presunto’ del self.d[i] >>> for i in d: ... print i + ’:’ + d[i] def __setitem__(self, k, v): eggs:ovos self.d[k.lower()] = v ham:presunto >>> d.get(’HaM’) def __getitem__(self, k): presunto return self.d[k.lower()] >>> d[’eGGs’] ’ovos’ def __iter__(self): return iter(self.d) def __len__(self): return len(self.d)
  • 46. Subclassing dict de collections.MutableMapping from collections import MutableMapping class Dicto(MutableMapping): def __init__(self): self.d = {} >>> d = Dicto() >>> d[’eggs’] = ’ovos’ def __delitem__(self, i): >>> d[’ham’] = ’presunto’ del self.d[i] >>> for i in d: ... print i + ’:’ + d[i] def __setitem__(self, k, v): eggs:ovos self.d[k.lower()] = v ham:presunto >>> d.get(’HaM’) def __getitem__(self, k): presunto return self.d[k.lower()] >>> d[’eGGs’] ’ovos’ def __iter__(self): return iter(self.d) def __len__(self): return len(self.d)
  • 47. Referência • Lightning Talk de: no fisl 2011. • The Data Structures of Python, Alex Gaynor no PyCon2011 • http://www.doughellmann.com/PyMOTW/abc/index.html • http://docs.python.org/library/collections.html
  • 48. Dúvidas? André Ericson http://www.github.com/aericson de.ericson@gmail.com @_aericson