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