Construyendo diccionarios (Era: Recuperando valores de diccionarios.)
Víctor Peinado
vitojph en gmx.net
Vie Jul 2 17:17:59 CEST 2004
¡Hola otra vez!
| > Y una pregunta más: ¿cómo construyo diccionarios multidimensionales (un
| > hash de hashes)?
|
| Pues de la manera más obvia:
| >>> a = {1: "uno", 2: "dos", 3: "tres", 1234: "mucho"}
| >>> b = {4: "cuatro", 5: "cinco", 6: "sei", 1234: "ni poco"}
| >>> c = {1:a, 2:b}
| >>> c
|
| {1: {1: 'uno', 2: 'dos', 3: 'tres', 1234: 'mucho'}, 2: {1234: 'ni poco', 4:
| 'cuatro', 5: 'cinco', 6: 'sei'}}
A raíz de esta respuesta que me dieron el otro día (muy útil, por cierto), me
surge otra: ¿como puedo construir diccionarios multidimensionales "on the
fly", utilizando como claves cadenas que extraigo de un fichero? Me explico:
Estoy leyendo línea a línea un fichero. Quiero contabilizar las veces que mis
usuarios (pepito, manolito, jesusito... ) han utilizado uno de los dos
sistemas disponibles (A y B). Imaginad que a partir del siguiente ficherito:
pepito A
pepito B
pepito A
manolito A
manolito A
jesusito B
jesusito A
quiero construir un diccionario del tipo:
datos = {'pepito':{'A':2, 'B':1}, 'manolito':{'A':2}, 'jesusito':{'A':1,
'B':1}}
El ejemplo es ad hoc pero ilustra el problema que estoy teniendo. Al lanzar el
siguiente script:
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import sys
datos = {}
for linea in file('usuarios.txt'):
# separo los datos que me interesan
campos = linea.split()
usuario, sistema = campos[0], campos[1]
if usuario in datos:
# ya "he visto" a este usuario
if sistema in datos[usuario]:
# no es la primera vez que usa este sistema, así que incremento
datos[usuario][sistema] += 1
else:
# es la primera vez que usa este sistema, así que la clave
datos[usuario][sistema] = 1
else:
# es la primera vez que este usuario utiliza este sistema
datos[usuario][sistema] = 1 # casca aquí
print datos
En la penúltima línea me salta un: KeyError: 'pepito'. ¿Estoy asignando
incorrectamente los valores? ¿Algún alma caritativa me echa una mano? O
mejor, ¿qué tuto puedo leer para terminar de entender esto y no volver a
preguntar cosas que parecen obvias?
Saludos y muchas gracias desde ya.
--
Res publica non dominetur.
Víctor Peinado || vitojph gmx net || http://vitojph.yoll.net
Fingerprint: C0D5 22EA 607C 47F9 28D7 3FFB 1CE0 342F 1285 66CA
JID: vitojph jabber dk || <vitojph />
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es