Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/06/2010, 18:15
paridin
 
Fecha de Ingreso: abril-2009
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 1
Diccionarios Dentro de Diccionarios

Hola compañeros de este foro, vendo este día a pedir de su ayuda recien comienzo con python y se me vino la loquera de hacer un algoritmo un poco complicado en este lenguaje pero bueno la cuestión es, he usado varios lenguajes y por lo regular la lógica es similar en ellos sin embargo en python es un poco diferente esto en las iteraciones y la condiciones bien, concretamente necesito hacer un diccionarios con datos que tiene una llave auto incremental, y cada llave tiene un valor de tipo diccionario, y este a su vez contiene otra llave la cual es un nombre y de ahi su valor de este es de otro diccionario el cual su llave tiene es otro nombre, y al final su valor de esta ultima contiene un valor de punto flotante ,desde código se mira algo así:

Código:
variable = { 0 : { "nombre1" : { "subNombre1" : 0.0 } }, ... }
Y bien con esto pego mi código como lo estoy creando.


Código:
def entropy(self, column, values ):
		entropyValue = 0.0
		frequency = {}
		index = 0
		data = self.mixColumn(column,values)
		namesClass = self.getTargetNames(values)
		for i in data.values():
			for dat,val in zip( i.keys(), i.values() ):
				# Build the first array  contrullo mi array
				if not frequency :
					frequency[index] = { dat : {val:0.0} }
				elif not frequency[index].has_key(dat):
					#if index <= self.objetiveNumberClass :
					index += 1
					frequency[index] = { dat : {val:0.0} }
				elif not frequency[index][dat].has_key(val):
					frequency[index] = { dat : {val:0.0} }
				# creo que aqui viene mi problema
				if (dat in frequency[index].keys()) and (val in frequency[index][dat].keys()) and (index in frequency.keys()) :
					frequency[index][dat][val] += 1.0 
						
		print frequency	
		return entropyValue
La impresión me está dando lo siguiente

Código:
{0: {'Alta': {'no': 2.0}}, 1: {'Normal': {'si': 1.0}}, 2: {'Baja': {'no': 1.0}}, 3: {'Normal': {'si': 1.0}}, 4: {'Alta': {'si': 1.0}}, 5: {'Baja': {'si': 1.0}}, 6: {'Alta': {'si': 1.0}}, 7: {'Normal': {'si': 2.0}}, 8: {'Baja': {'no': 1.0}}}
pero lo que yo quiero es como el primer valor 0 : Alta : no : 2.0 , osea la suma de los valores repetidos
por ejemplo contar si "ALTA" , "no" existen 10 veces que me diera

Código:
{0: {'Alta': {'no': 10.0}}
Para esto se que debo buscar en el diccionario creado y si existe recuperar su id e incrementarlo en el ultimo paso, pero lamentablemente no encuentro el como, pues no entiendo aun la lógica de python, tengo 3 días usando python por eso me dirijo a ustedes si me pueden explicar como se debería encontrar en un diccionario como el que manejo.

dejo el código que uso para pruebas
Código:
class ID3:
          def __init__(self):

          return 

          def getTargetNames(self, column):
		namesColumns = []
		for name in set(column):
			# i make a list with names of objetive column
			namesColumns.append(name)
			self.objetiveNameClass.append(name)
		#
		columnComplete={}
		count = 0
		for i in namesColumns:
			columnComplete[i] = column.count(i)
		#print columnComplete
		self.objetiveNumberClass = len(self.objetiveNameClass)
		#print(len(objetiveColumn))
		#print(self.objetiveNumberClass)
		return namesColumns
	
	def mixColumn ( self, column, values):
		j = 0
		mix = {}
		for i in column:
			temp = values[j]
			mix[j] = {i:temp}
			j += 1
		return mix

def main():
        paColumn = 
["Alta","Alta","Normal","Baja","Baja","Baja","Normal","Alta","Alta","Baja","Alta","Normal","Normal","Baja"]
	objetiveColumn = ['no','no','si','si','si','no','si','no','si','si','si','si','si','no']
        ID = ID3()
        ID.entropy(paColumn,objetiveColumn)
if __name__ == '__main__':
	main()
Sin necesitan más información se las brindare lo más rápido posible, gracias y espero me puedan apoyar.

Un Saludo.