lunes, 2 de marzo de 2009

DICCIONARIOS EN PYTHON

Los Diccionarios tambien llamados matrices asociativas , ya que son colecciones que contiene clave:valor ejemplo:

>>>diccionario = {"enero":1,"febrero":2,"marzo":3}
>>>diccionario
{'enero': 1, 'marzo': 3, 'febero': 2}

En la parte de la clave podemos usar cualquier tipo de valor inmutable: numeros, candenas, booleanos o tuplas menos listas o diccionarios dado que son mutables. La difrencia que existe entre diccionarios con la listas o las tuplas es que los valores almacenados en el diccionario no se le accede a traves de su indice si no atraves de su clave utilizando el operador de [] asi que de esta forma nuestros diccionarios no tienen un orden prestablecido :|

>>>diccionario["enero"]
1

de esta misma manera podemos modificar valores

>>>diccionario["enero"]=2
>>>diccionario["enero"]
2

lo dejamos como estaba

>>>diccionario["enero"]=1
>>>diccionario["enero"]
1

bueno en los diccionarios no se usa el slicing, entre otras cosa ya que los diccionarios no son secuencia, sino Mappings (mapeados, asociaciones)

FUNCIONES BASICAS :

has_key(k) Comprueba si el diccionario tiene la clave k. Es equivalente a la sin-
taxis k in D.

valido en python 2.x veamos:

>>>diccionario.has_key("enero")
True

si la clave enero se encuentra en nuestro diccionario nos devuelve True en caso contrario False, una equivalencia de esto seria:

>>> "enero" in diccionario
True

Debido a esta equivalencia este metodo se convertio en algo redundante producinedo una ambiguedad innecesaria, debido a esto la funcion D.has_key(k) fue eliminada de Python 3.x veamos:

valido solo en python 3.x

>>> "enero" in diccionario
True


ahora probemos la funcion has_key(k) en python 3.x

>>>diccionario.has_key('febrero')

Traceback (most recent call last):
File "", line 1, in
AttributeError: 'dict' object has no attribute 'has_key'

como podemos comprobar la funcion has_key fue eliminada de python 3.x pero de igual forma contamos con >>>"enero" in diccionario para saber si se encuentra una clave de un diccionario :)


get(k[, d])
Busca el valor de la clave k en el diccionario. Es equivalente a utilizar D[k] pero al utilizar este método podemos indicar un valor a devolver por defecto si no se encuentra la clave, mientras que con la sintaxis D[k], de no existir la clave se lanzaría una excepción veamos:

>>>diccionario.get("marzo")
3

esto tambien lo podiamos averiguar de la froma D[k]

>>>diccionario["marzo"]
3

la ventaja de la funcion get(k[, d]) es que podemos indicar un valor a devolver si la clave no esta:

>>>diccionario.get("abril","valor no encontrado de la clave dada")
>>>'valor no encontrado de la clave dada'

bueno ahi defini un mensaje personalizado pero puede ser tambien que devuelva un entero o una lista etc.

items() Devuelve una lista de tuplas con pares clave-valor.

python 2.x

>>> diccionario.items()
[('enero', 2), ('marzo', 3), ('febero', 2)]

python 3.x

>>> list[diccionario.items()]
[('enero', 2), ('marzo', 3), ('febero', 2)]

como ven el resutado devuelto es una lista [(clave:valor),......]

keys() Devuelve una lista de las claves del diccionario.

python 2.x

>>>diccionario.keys()
['enero', 'marzo', 'febero']

python 3.x

>>>list(diccionario.keys())
['enero', 'marzo', 'febero']

values() Devuelve una lista de los valores del diccionario.

python 2.x

>>> diccionario.values()
[2, 3, 2]

python 3.x

>>> list(diccionario.values())
[2, 3, 2]

pop(k[, d]) Borra la clave k del diccionario y devuelve su valor. Si no se encuentra dicha clave se devuelve d si se especificó el parámetro o bien se lanza una excepción.

equivalente tanto para python 2.x como 3.x

>>> diccionario.pop("enero")
2
>>>diccionario
{'marzo': 3, 'febero': 2}


tambien podemos hacer esto y es equivalentes tanto Python 2.x y 3.x:

del diccionario ["marzo"]
>>>diccionario
{'febero': 2}

si queremos eliminar todos los elemntod del dicionario tan solo hacemos:

>>>diccionario.clear()
{ }

si se fijaron bien los metodos keys(), values() y items() de un diccionario devolvían listas en key() devolvia una lista de las claves de un diccionario, de values() devolvia una lista de los valores de un diccionario y items() devolvia una lista con clave:valor del diccionario osea el diccionario completo pero en una lista, cada una de esas funciones tiene una funcion analoga que serian:

keys() analoga iterkeys()
values() analoga itervalues()
items() analoga iteritems()

estas funciones analogas devuelven iteradores sobre la misma secuencia que las anteriores, esto de los iteradores lo explicare con mas detalle mas adelante.

tambien se fijaron que en python 3.x hacemos en algunas funciones el llamados de list
list(diccionario.values()) para imprimir los datos buen es que en python 3 se introduce un concepto llamado vista y vamos a tratar de ver las ventajas que trae esto contra versiones anteriores de python 3.x ya que cuando hacemos diccionario.keys() en python3 obtengo es la vista del diccionario veamos:

python 3.x

>>>d=diccionario.keys() #obtengo la vista del diccionario
>>>type(v)
class 'dict_keys'

como ves es de tipo

class 'dict_keys'

>>> iterador= iter(v) # construyo un iterador a partir de la vista (no del dict!)
>>> keys = list(v) # construyo una lista a partir de la vista

como ves es por eso que en python 3.x construimos la lista a partir de la vista si estamos en una version de python 2.x los iteradores lo conseguiamos de las funciones homologas (iterkeys(),iteritems() y itervalues() ) y en python 3.x solo con la funcion iter iterador= iter(v)


veamos con un ejemplo el concepto de vista para Python 3.x y su funcion iter() que su proposito puede ser mas para compatibilidad hacia atras con versiones previs a python 3.x

diccionario de ejemlo:

>>>dic={"guido":"python","linus":"linux","richard":"gnu"}

python 2.x

>>>iterador=dic.iterkeys()

ahora borremos un elemento del diccionario:

>>>del(dic["linus"])

ahora iteramos:

>>>for key in iterador:
.... print key
....

Traceback (most recent call last):
File "", line 1, in
NameError: name 'iterador' is not defined


bueno nos genera un error ya que nuestro iterador tiene un diccionario definido y al modificarlo
ya no podemos iterarlo osea recorrerlo con el for :( y ahi es donde entra el concepto de vista con python3 porque las vista son iterables :) veamos:

python 3.x

>>>dic={"guido":"python","linus":"linux","richard":"gnu"}

obtenemos la vista:
>>> vista=dic.keys()

ahora borremos un elemento del diccionario

>>>del(dic["linus"])

ahora iteramos con la vista:

>>>for key in vista:
.... print (key)
....

guido
richard


si en python 3.x hubieramos obtenido el iterador atraves de la funcion iter() asi iterador=iter(dic.keys()) si hacemos asi en python 3 tendriamos un comportamiento similar a Python 2.x y es el de que ese iterador no soporta modificacion durante la ejecucion.

Bueno creo que con lo que llevamos hasta aqui de python que son los tipos de datos operadores, listas, tuplas y diccionarios que era algo fundamental antes de iniciar con funciones, sentencias condicionales y bucles, que lo veremos ya en el proximo post. vamos despacios porque con el lanzamiento de python3 en cada tema vamos mostrando como se hace en python 2.x y ahora como se hace en python 3.x bueno no es todo pero donde hallan cambios lo ire indicando para que los que andan practicando vean el porque de las excepciones que nos arroja, bueno cualquier duda me la hacen saber bye.

Write By Hackchan

18 comentarios:

  1. Realmente excelente, estoy enseñando Python en un colegio y tu pagina es muy muy util. Muchas gracias, Dios te bendiga.
    Andrés

    ResponderEliminar
  2. Como seria un diccionario que en la clave contiene tuplas??

    ResponderEliminar
  3. komo imprimo la frases del dicionario y su significado
    palabra(significado)
    y q me kede asi

    ResponderEliminar
  4. ke onda mau como andas???????

    ResponderEliminar
  5. yo bien y ustedes???

    ResponderEliminar
  6. exelente aka comuinicandonos con la ana jajajajaja

    ResponderEliminar
  7. gracias por resolver estas dudas!!

    ResponderEliminar
  8. Hola podria hacer una pregunta?

    ResponderEliminar
  9. Hola gracias por los tips de los diccionarios realmente útil ;) aparte el plus de mostrar diferencias entre cada versión te luciste man ;)
    Entre porque queria hacer un diccionario con varios valores, ahora me quedo claro que la clave no puede ser lista, pero los valores no mencionaste restricciones así que hize la prueb ay si funciono ;)
    >>>lista = ["hello", "hi"]
    >>>dict = {"saludos": lista}
    >>>dict
    {"saludos": ["hello", "hi"]}
    Gracias chaoo

    ResponderEliminar
  10. Gracias, me ayudaste con unas dudas! Sigue así!

    ResponderEliminar
  11. muy completo.. gracias

    ResponderEliminar
  12. gracias, esta claro y bien documentado.

    ResponderEliminar
  13. Gracias excelente documento de ayuda

    ResponderEliminar