python gems compilation

Negli ultimi giorni sono apparsi due articoli che hanno suscitato parecchio interesse, uno di Eric Florenzano, autore di diversi addons per Django e un altro di un certo Eric Holscher, mai sentito prima. Alcune gemme sono piuttosto sfiziose…

  • setdefault Caso tipo:
>>> dict = {}
>>> lista_nomi = ['stan', 'kyle', 'kenny', 'eric', 'butters', 'timmy']
>>> for nome in lista_nomi:
...     try:
...             dict[nome[0]].append(nome)
...     except KeyError:
...             dict[nome[0]] = [nome]
...
>>> dict
{'s': ['stan'], 'b': ['butters'], 'e': ['eric'], 'k': ['kyle', 'kenny'], 't': ['timmy']}

Ad occhio ci dovrebbe essere un modo più semplice di farlo, ed infatti…

>>> dict = {}
>>> lista_nomi = ['stan', 'kyle', 'kenny', 'eric', 'butters', 'timmy']
>>> for nome in lista_nomi:
...     dict.setdefault(nome[0], []).append(nome)
...
>>> dict
{'s': ['stan'], 'b': ['butters'], 'e': ['eric'], 'k': ['kyle', 'kenny'], 't': ['timmy']}
  • defaultdict Come alternativa a setdefault applicato al caso precedente, si può usare questo oggetto dictionary-like, a patto che gli elementi del dizionario siano omogenei (nella fattispecie delle liste)
>>> from collections import defaultdict
>>> defdict = defaultdict(list)
>>> lista_nomi = ['stan', 'kyle', 'kenny', 'eric', 'butters', 'timmy']
>>> for nome in lista_nomi:
...     defdict[nome[0]].append(nome)
...
>>> defdict
defaultdict(<type 'list'>, {'s': ['stan'], 'b': ['butters'], 'e': ['eric'], 'k': ['kyle', 'kenny'], 't': ['timmy']})
>>> dict(defdict)
{'s': ['stan'], 'b': ['butters'], 'e': ['eric'], 'k': ['kyle', 'kenny'], 't': ['timmy']}
>>>

L’ultima istruzione riporta il defaultdict a dizionario, nel caso fosse necessario

  • title Metodo semisconosciuto della classe str, utilissimo se si ha la necessità di “titolizzare” una stringa
>>> s = 'la nave va sul mare'
>>> s.title()
'La Nave Va Sul Mare'
  • enumerate Utilissima se serve conoscere l’indice di una lista mentre iteriamo, senza ricorrere ad una variabile incremento
>>> lista_nomi = ['stan', 'kyle', 'kenny', 'eric', 'butters', 'timmy']
>>> for indice, nome in enumerate(lista_nomi):
...     print "indice %d: %s" % (indice,nome)
...
indice 0: stan
indice 1: kyle
indice 2: kenny
indice 3: eric
indice 4: butters
indice 5: timmy
  • 128 Questo il flag da passare alla funzione compile del modulo re per ottenere la stampa di debug di una regular expression. Il valore 128 corrisponde a re.DEBUG, ma facendo un help(re) di tutto ciò nemmeno l’ombra.
>>> import re
>>> re.DEBUG
128
>>>
>>> pat = re.compile('.*\.txt$', 128)
max_repeat 0 65535
  any None
literal 46
literal 116
literal 120
literal 116
at at_end
>>>
Advertisements

One thought on “python gems compilation

Comments are closed.