miércoles, 26 de febrero de 2014

Python básico I, diccionarios




Comienzo una serie de entradas para complementar algunos de los aspectos tratados en Python exquisite. Se trata, por lo general, de conceptos básicos pero fundamentales que quisiera tener por escrito. Esta primera entrada versará sobre los diccionarios. 

Un diccionario es una serie de datos indexados por una clave, la cual puede ser numérica o no. La forma habitual de crear un diccionario es mediante la combinación de la clave y el valor o dato en la forma key : value. Hay varias formas equivalentes de construir un diccionario:


>>> a =dict(one=1, two=2)
>>> b ={'one' : 1, 'two' : 2}
>>> c ={'two' : 2, 'one' : 1}
>>> a == b == c                                                                                                  
True             

La clave no puede ser modificable y debe ser única. Por ejemplo, no podemos emplear una lista como clave, ya que la lista puede ser modificada de alguna manera, por ejemplo mediante append(). En el ejemplo anterior también se observa que los diccionarios no son conjuntos ordenados, el orden es irrelevante.

Hay algunas formas más complejas de crear diccionarios:

>>> e = {x: x**2 for x in (1,2,3)}
>>> e
{1: 1, 2: 4, 3: 9}

Para acceder a todo el diccionario se puede emplear items(), para una lista de las claves keys() y values() para una lista de valores:


>>> 
e = {n: n**2 for n in range(1,5)}
>>> e.items()
[(1, 1), (2, 4), (3, 9), (4, 16)]
>>> e.keys()
[1, 2, 3, 4]
>>> e.values()
[1, 4, 9, 16]

A continuación un ejemplo más completo para acceder y añadir datos a un diccionario. Se trata de un catálogo de una biblioteca con título y número ejemplares disponibles (línea 1), el título hace el papel de clave. Compramos un libro nuevo, verificamos si existe en el catálogo (línea 2), si existe se suma un ejemplar al título ya presente (línea 3), en caso contrario se añade al catálogo.

>>> books = {'Crimen y castigo': 3, 'Calculus': 5}
>>> if 'Cronicas marcianas' in books:
...     books['Cronicas marcianas'] = books['Cronicas marcianas'] + 1
... else:
...     books['Cronicas marcianas'] = 1
... 
>>> books 
{'Calculus': 5, 'Crimen y castigo': 3, 'Cronicas marcianas': 1}

Ahora fusionamos dos bibliotecas (books2) incorporando todos sus títulos a nuestra biblioteca (books):

>>> books2 = {'La conjura de los necios': 2}
>>> books.update(books2)
>>> books
{'Calculus': 5, 'La conjura de los necios': 2, 'Crimen y castigo': 3
, 'Cronicas marcinas': 1}

Los diccionarios no son colecciones ordenadas y aunque muchas veces aparecen en orden en otras muchas encontraremos que la disposición se presenta al azar. Cuando nos resulta imprescindible un orden podemos emplear OrderedDict. 

>>> from collections import OrderedDict
>>> ordered = OrderedDict((num,str(num)) for num in range(1,7))
>>> ordered.items()
[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6')] 
Cerramos esta entrada sobre los diccionarios explicando como eliminar elementos, limpiar un diccionario o eliminarlo por completo

>>> del ordered[1]
>>> ordered.items()
[(2, '2'), (3, '3'), (4, '4'), (5, '5'), (6, '6')]
>>> ordered.clear()
>>> ordered.items()
[]
>>> del ordered
>>> ordered.items()
Traceback (most recent call last):
  File " in="" line="" module="" stdin=">">NameError: 
name 'ordered' is not defined
 
La siguiente entrada sobre Python básico versará sobre los slices.

No hay comentarios:

Publicar un comentario