Red de conocimiento informático - Material del sitio web - Cómo utilizar el diccionario con éxito

Cómo utilizar el diccionario con éxito

Este artículo examina la jerarquía de tipos de Python e introduce el tipo de contenedor de diccionario. A diferencia de los tipos de contenedores de listas, cadenas y tuplas de Python discutidos en artículos anteriores, el tipo de diccionario es un contenedor desordenado que se basa en una asignación clave-valor. Por lo tanto, se accede a los elementos del diccionario en función de sus valores clave, no en función de su posición en la secuencia. Las características únicas del tipo de diccionario pueden parecer inusuales, pero si se usan correctamente, pueden proporcionar capacidades poderosas.

diccionario

Todos hemos utilizado un diccionario de idiomas para buscar la definición de una palabra que no conocíamos. Un diccionario de idiomas proporciona un conjunto estándar de información para una palabra determinada (como Python). Este sistema asocia (mapas) definiciones y otra información con palabras reales. Utilice palabras como localizadores clave para encontrar información de interés. Este concepto se extiende al lenguaje de programación Python y se convierte en un tipo de contenedor especial llamado diccionario.

El tipo de datos diccionario existe en muchos idiomas. A veces se le llama matriz asociativa (porque los datos están asociados con un valor clave) o tabla hash. Pero en Python, el diccionario es un objeto agradable, por lo que incluso un novato en programación puede usarlo fácilmente en sus propios programas. Hablando formalmente, un diccionario en Python es un tipo de datos contenedor de mapeo heterogéneo y mutable.

Creación de un diccionario

Los artículos anteriores de esta serie introdujeron algunos de los tipos de datos de contenedor en el lenguaje de programación Python, incluidas tuplas, cadenas y listas (ver Recursos). Estos contenedores son similares en que están basados ​​en secuencias. Esto significa que se accede a los elementos de estas colecciones en función de su posición en la secuencia. Entonces, dada una secuencia llamada a , puede acceder a elementos usando índices numéricos (como a[0] ) o fragmentos (como a[1:5] ). El tipo de contenedor de diccionario en Python se diferencia de estos tres tipos de contenedor en que es una colección desordenada. En lugar de utilizar números de índice, utiliza valores clave para acceder a los elementos de la colección. Esto significa que construir un contenedor de diccionario es algo más complejo que una tupla, una cadena o una lista porque se deben proporcionar tanto las claves como los valores correspondientes, como se muestra en el Listado 1.

Listado 1. Creando un diccionario en Python, Parte 1

>>> d = {0: 'cero', 1: 'uno', 2 : 'dos', 3 : 'tres', 4 : 'cuatro', 5: 'cinco'}

>>> d

{0: 'cero', 1: 'uno', 2 : 'dos', 3: 'tres', 4: 'cuatro', 5: 'cinco'}

>>> len(d)

>>> tipo(d ) # El objeto base es la clase dict

>>> d = {} # Crea un diccionario vacío

>>> len (d)

>>> d = {1 : 'one'} # Crear un diccionario de un solo elemento

>>> d

{1: ' one'}

>>> len(d)

>>> d = {'one' : 1} # El valor clave puede ser no numérico

>>> d

{'uno': 1}

>>> d = {'uno': [0, 1,2 , 3, 4, 5 , 6, 7, 8, 9]}

>>> d

{'uno': [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9]}

Copiar código

Como se muestra en este ejemplo, la creación de un diccionario en Python utiliza llaves y combinaciones clave-valor separadas por dos puntos. Si no se proporciona ninguna combinación clave-valor, se crea un diccionario vacío. El uso de una combinación clave-valor crea un diccionario con un elemento, y así sucesivamente, hasta el tamaño que necesite. Al igual que con cualquier tipo de contenedor, puede averiguar la cantidad de elementos de la colección utilizando el método len incorporado.

El ejemplo anterior también demuestra otra cuestión importante sobre los contenedores de diccionarios. La clave no se limita a un número entero; puede ser cualquier tipo de datos inmutable, incluidos números enteros, flotantes, tuplas o cadenas. Como la lista es mutable, no se puede utilizar como clave en un diccionario. Pero los valores del diccionario pueden ser de cualquier tipo de datos.

Finalmente, este ejemplo ilustra que el tipo de datos subyacente del diccionario en Python es un objeto dict. Para obtener más información sobre el uso de diccionarios en Python, puede utilizar el intérprete de ayuda integrado para conocer la clase dict, como se muestra en el Listado 2.

Listado 2. Obtener ayuda sobre el diccionario

>>> ayuda(dict)en la clase dict en el módulo __builtin__:

dict(objeto)

| dict() -> nuevo diccionario vacío.

| dict(mapping) -> nuevo diccionario inicializado a partir de pares (clave, valor) de un objeto de mapeo. /p>

| dict(seq) -> nuevo diccionario inicializado como si fuera a través de:

| d = {}

| >

| p>

| d[k] = v

| dict(**kwargs) -> nuevo diccionario inicializado con los pares nombre=valor

| en la lista de argumentos de palabras clave. Por ejemplo: dict(one=1, two=2)

|

| Métodos definidos aquí:

|

| __cmp__(…)

| x.__cmp__(y) <==> cmp(x,y)

|

| (…)

| x.__contiene__(y) <==> y en x

|

| __delitem__(…)

| >| (y) <==> del x[y]

…[/code]La ayuda para la clase dict señala que puedes usar el constructor para crear un diccionario directamente sin usar llaves. Dado que se deben proporcionar más datos al crear un diccionario en comparación con otros tipos de datos de contenedor, no sorprende que estos métodos de creación sean complejos. Sin embargo, usar un diccionario no es difícil en la práctica, como se muestra en el Listado 3.

Listado 3. Creando un diccionario en Python, Parte 2

>>> l = [0, 1,2 , 3, 4, 5, 6, 7, 8, 9 ]

>>> d = dict(l)(última llamada más reciente):

Archivo "", línea 1, en ?: no se puede convertir el diccionario

actualizar el elemento de secuencia #0 a una secuencia

>>> l = [(0, 'cero'), (1, 'uno'), (2, 'dos' ) , (3, 'tres')]

>>> d = dict(l)

>>> d

{0: 'cero', 1: 'uno', 2: 'dos', 3: 'tres'}

>>> l = [[0, 'cero'], [1, 'uno'], [2 , 'dos'], [3, 'tres']]

>>> d

{0: 'cero', 1: 'uno', 2: 'dos' , 3: 'tres'}

>>> d = dict(l)

>>> d

{0: 'cero', 1: ' uno', 2: 'dos', 3: 'tres'}

>>> d = dict(cero=0, uno=1, dos=2, tres=3)

>>> d

{'cero': 0, 'tres': 3, 'dos': 2, 'uno': 1}

>>> d = dict(0=cero, 1=uno, 2=dos, 3=tres): la palabra clave no puede ser una expresión

Copia el código

Como puedes ver, al crear un El diccionario requiere valores clave y valores de datos. El primer intento de crear un diccionario a partir de la lista falla porque no hay pares clave-valor de datos coincidentes. El segundo y tercer ejemplo demuestran cómo crear un diccionario correctamente: en el primer caso, se usa una lista, cada elemento de la cual es una tupla; en el segundo caso, también se usa una lista, pero cada elemento en ella es otra lista; . En ambos casos, el contenedor interno se utiliza para obtener una asignación de claves a valores de datos.

Otra forma de crear un contenedor dict directamente es proporcionar directamente una asignación de claves a valores de datos. Esta técnica permite definir explícitamente las claves y sus valores correspondientes. En realidad, este método es menos útil porque se puede realizar la misma tarea usando llaves. Además, como se muestra en el ejemplo anterior, no puede utilizar números como claves cuando utilice este método; de lo contrario, se generará una excepción.

Acceder y modificar diccionario

Después de crear un diccionario, es necesario acceder a los datos contenidos en él. El acceso es similar a acceder a datos en cualquier tipo de datos de contenedor de Python, como se muestra en el Listado 4.

Listado 4. Accediendo a elementos en el diccionario

>>> d = dict(cero=0, uno=1, dos=2, tres=3)

>>> d

{'cero': 0, 'tres': 3, 'dos': 2, 'uno': 1}

>>> d[ ' cero']

>>> d['tres']

>>> d = {0: 'cero', 1: 'uno', 2 : 'dos' , 3 : 'tres', 4 : 'cuatro', 5: 'cinco'}

>>> d[0]

'cero'

> >> d[4]

'cuatro'

>>> d[6](última llamada más reciente):

Archivo " " , línea 1, en ?: 6

>>> d[:-1](última llamada más reciente):

Archivo "", línea 1, en ? : tipo unhashable

Copiar código

Como puede ver, el proceso de obtener valores de datos de un diccionario es casi exactamente el mismo que obtener datos de cualquier tipo de contenedor. Coloque el valor clave entre corchetes después del nombre del contenedor. Por supuesto, los diccionarios pueden tener valores clave no numéricos, a los que puede tomar algún tiempo acostumbrarse si no ha trabajado con este tipo de datos antes. Dado que el orden no es importante en un diccionario (el orden de los datos en un diccionario es arbitrario), la funcionalidad de fragmento que está disponible con otros tipos de datos de contenedor no está disponible con un diccionario. Intentar utilizar un fragmento o intentar acceder a datos desde una clave que no existe generará una excepción que indica el error relevante.

El contenedor del diccionario en Python también es un tipo de datos mutable, lo que significa que se puede modificar después de su creación. Como se muestra en el Listado 5, se pueden agregar nuevas asignaciones de valores de clave a datos, se pueden modificar las asignaciones existentes y se pueden eliminar las asignaciones.

Listado 5. Modificar diccionario

>>> d = {0: 'cero', 1: 'uno', 2: 'dos', 3: 'tres'}

>>> d[0]

'cero'

>>> d[0] = 'Cero'

>> > d

{0: 'Cero', 1: 'uno', 2: 'dos', 3: 'tres'}

>>> d[4] = ' cuatro'

>>> d[5] = 'cinco'

>>> d

{0: 'Cero', 1: 'uno' , 2: 'dos', 3: 'tres', 4: 'cuatro', 5: 'cinco'}

>>> del d[0]

>>> d

{1: 'uno', 2: 'dos', 3: 'tres', 4: 'cuatro', 5: 'cinco'}

>>> d [0] = 'cero'

>>> d

{0: 'cero', 1: 'uno', 2: 'dos', 3: 'tres', 4: 'cuatro', 5: 'cinco'}

Copiar código

El Listado 5 demuestra varios puntos importantes. Primero, modificar los valores de los datos es simple: asigne el nuevo valor a la clave adecuada. En segundo lugar, agregar nuevas asignaciones de valores de clave a datos también es simple: asigne los datos relevantes al nuevo valor de clave. Python hace todo el procesamiento automáticamente. No es necesario llamar a métodos especiales como append. Para el contenedor del diccionario, el orden no es importante, por lo que debería ser fácil de entender, porque en lugar de agregar la asignación después del diccionario, se agrega al contenedor. Finalmente, la forma de eliminar un mapa es utilizar el operador del junto con la clave que debe eliminarse del contenedor.

Una cosa que parece un poco extraña en el Listado 5 es que las claves se muestran en orden numérico, y este orden es el mismo que el orden en que se insertó el mapa. No me malinterpretes, este no es siempre el caso. El orden de las asignaciones en el diccionario de Python es arbitrario y puede variar entre diferentes instalaciones de Python, o incluso cuando el mismo código se ejecuta varias veces utilizando el mismo intérprete de Python. Esto se ve fácilmente si utiliza diferentes tipos de claves y valores de datos en un diccionario, como se muestra en el Listado 6.

Listado 6. Contenedores heterogéneos

>>> d = {0: 'cero', 'uno': 1}

>>> d

{0: 'cero', 'uno': 1}

>>> d[0]

'cero'

> >> tipo(d[0])

>>> d['uno']

>>> tipo( d['uno'])

>>> d['dos'] = [0, 1, 2]

>>> d

{0: 'cero', 'dos': [0, 1, 2], 'uno': 1}

>>> d [3 ] = (0, 1, 2, 3)

>>> d

{0: 'cero', 3: (0, 1, 2, 3), 'dos ': [0, 1, 2], 'uno': 1}

>>> d[3] = 'una tupla'

>>> d

{0: 'cero', 3: 'una tupla', 'dos': [0, 1, 2], 'uno': 1}

Copiar código

Como muestra este ejemplo, puede utilizar claves y valores de datos de diferentes tipos de datos en un diccionario. También puedes agregar nuevos tipos modificando el diccionario. Finalmente, el orden del diccionario resultante no coincide con el orden en el que se insertaron los datos. Básicamente, el orden de los elementos en un diccionario está controlado por la implementación real del tipo de datos del diccionario de Python. Los nuevos intérpretes de Python pueden cambiar fácilmente este orden, así que asegúrese de no depender de un orden específico de elementos en el diccionario.

Programación con diccionarios

Como tipo de datos formal de Python, los diccionarios admiten la mayoría de las operaciones admitidas por otros tipos de datos más simples. Estas operaciones incluyen operadores relacionales generales como <, > y ==, como se muestra en el Listado 7.

Listado 7. Operadores relacionales generales

>>> d1 = {0: 'zero'}

>>> d2 = {'zero': 0 }

>>> d1 < d2

>>> d2 = d1

>>> d1 < d2

>> > d1 == d2

>>> id(d1)

>>> id(d2)

>>> d2 = d1.copia()

>>> d1 == d2

>>> id(d1)

>>> id(d2)

Copiar código

El ejemplo anterior crea dos diccionarios y los utiliza para probar el operador relacional <. Aunque es raro comparar dos diccionarios de esta manera, se puede hacer si es necesario.

Este ejemplo luego asigna el diccionario asignado a la variable d1 a otra variable d2. Tenga en cuenta que el método id() integrado devuelve el mismo valor de identificador para d1 y d2, lo que indica que no se trata de una operación de copia. Para copiar un diccionario, utilice el método copy(). Como puede ver en las últimas líneas de este ejemplo, la copia es idéntica al diccionario original, pero la variable que contiene el diccionario tiene un identificador diferente.

Cuando utilices un diccionario en un programa Python, lo más probable es que quieras comprobar si el diccionario contiene una clave o valor específico. Como se muestra en el Listado 8, estas comprobaciones son fáciles de realizar.

Listado 8. Pruebas condicionales y diccionario

>>> d = {0: 'cero', 3: 'una tupla', 'dos': [0, 1, 2 ], 'uno': 1}

>>> d.keys()

[0, 3, 'dos', 'uno']

>>> si es 0 en d.keys():

... imprime 'Verdadero'

...

>>> si 'uno' en d:

... imprime 'Verdadero'

...

>>> si 'cuatro' en d:

... print 'El diccionario contiene cuatro'

... elif 'dos' en d:

... print 'El diccionario contiene dos'

... contiene dos

Copiar código

Probar la pertenencia de claves o valores de datos en un diccionario es sencillo. El tipo de datos del contenedor del diccionario proporciona varios métodos integrados, incluido el método claves() y el método valores() (no mostrado aquí). Estos métodos devuelven una lista que contiene las claves o valores de datos, respectivamente, del diccionario de llamada.

Por lo tanto, para determinar si un valor es una clave en un diccionario, debe usar el operador in para verificar si el valor está en la lista de claves devuelta llamando al método claves(). Se puede utilizar una operación similar para verificar si un valor está en la lista de valores de datos devueltos llamando al método value(). Sin embargo, puede utilizar el nombre del diccionario como notación abreviada. Esto tiene sentido porque generalmente desea saber si un determinado valor de datos (en lugar de un valor clave) está en el diccionario.

En "Descubre Python, Parte 6", viste lo fácil que es usar un bucle for para iterar sobre los elementos de un contenedor. La misma técnica funciona con diccionarios de Python, como se muestra en el Listado 9.

Listado 9. Iteración y diccionario

>>> d = {0: 'cero', 3: 'una tupla', 'dos': [0, 1, 2] , 'uno': 1}

>>> for k in d.iterkeys():

... print d[k]

.. . tupla

[0, 1, 2]

>>> para v en d.itervalues():

... imprimir v

... tupla

[0, 1, 2]

>>> para k, v en d.iteritems():

... print 'd[',k,'] = ',v

... [ 0 ] = cero[ 3 ] = una tupla[ dos ] = [0, 1, 2][ one ] = 1

Copiar código

Este ejemplo demuestra tres formas de iterar sobre un diccionario: usando un iterador de Python devuelto por iterkeys(), itervalues() o iteritems() método . (Por cierto, puede comprobar si estos métodos devuelven un iterador en lugar de un tipo de datos contenedor llamando a los métodos apropiados directamente en el diccionario, como d.iterkeys().) El método iterkeys() permite iterar sobre las claves del diccionario, mientras El método itervalues ​​() permite la iteración de los valores de datos contenidos en el diccionario. Por otro lado, el método iteritems() permite el recorrido simultáneo de la clave al mapeo de valores de datos.

Diccionario: otro potente contenedor de Python

Este artículo analiza el tipo de datos del diccionario de Python. Un diccionario es un contenedor heterogéneo y mutable que se basa en una asignación de claves a valores de datos (en lugar de un orden numérico específico) para acceder a los elementos del contenedor. Acceder, agregar y eliminar elementos en un diccionario es simple y el diccionario es fácil de usar con declaraciones compuestas, como declaraciones if o bucles for. Todos los diferentes tipos de datos se pueden almacenar en un diccionario y se puede acceder a ellos por nombre u otros valores clave compuestos (como tuplas), por lo que los diccionarios de Python permiten a los desarrolladores escribir declaraciones de programación concisas pero poderosas.