Aprendiendo PYTHON desde cero, Lección 30.

Iniciado por ViejoMajara, 21 Marzo 2015, 12:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

ViejoMajara

¡Hola!

En la lección 30 del manual de R.Narvaja, en la penúltima página, aparece un ejemplo en el que, para crear una salida con el nombre y salario de cada empleado,  hace lo siguiente:

Citar

lista={'Pepe':'I','Jose':'E','Pirulo':'I','Jorge':'E','Salvador':'E'}

for emp in lista:
    if lista[emp]=='E':
        a= Empleados(emp)
        a.computarSueldo()
        print a.empleado, a.sueldo
    else:
        a= Ingenieros(emp)
        a.computarSueldo()
        print a.empleado, a.sueldo


Se entiende perfectamente, pero al imprimir el orden en el que salen es:

Citar
Jose 2000
Pirulo 3000
Pepe 3000
Jorge 2000
Salvador 2000

Por más vueltas que le doy al tema no consigo averiguar el por qué de esta ordenación. ¿Podría alguien aclararlo?

Saludos

explorer

La ordenación de las entradas clave/valor en un diccionario o hash, es "aleatorio" (depende del cómputo del valor hash interno).

LaThortilla (Effort)

Cita de: ViejoMajara en 21 Marzo 2015, 12:35 PM

Por más vueltas que le doy al tema no consigo averiguar el por qué de esta ordenación. ¿Podría alguien aclararlo?

Saludos

sinceramente me he quedado con la duda... sera algun tipo de error de python... :huh:


MISMO CODIGO:
Código (python) [Seleccionar]

lista={'Pepe':'I',' Jose':'E', 'Pirulo':'I',  'Jorge':'E', 'Salvador':'E'}
class Empleados:
   def __init__(self,nombre):
       self.empleado = nombre
       
   def computarSueldo(self):
       self.sueldo=2000
class Ingenieros (Empleados):
   def __init__(self,nombre):
       self.empleado= nombre
       
   def computarSueldo(self):
       self.sueldo = 3000


for emp in lista:
   print(emp)
   if lista[emp]=='E':
       a= Empleados(emp)
       a.computarSueldo()
       print (a.empleado, a.sueldo)
   else:
       a= Ingenieros(emp)
       a.computarSueldo()
       print(a.empleado, a.sueldo)



DISTINTOS RESULTADOS: :huh: :huh: :huh: :huh: :huh:
Código (python) [Seleccionar]

>>> ================== RESTART ===================
>>>
Pepe
Pepe 3000
Pirulo
Pirulo 3000
Jorge
Jorge 2000
Jose
Jose 2000
Salvador
Salvador 2000
>>> ========================= RESTART===========================
>>>
Jorge
Jorge 2000
Pirulo
Pirulo 3000
Jose
Jose 2000
Pepe
Pepe 3000
Salvador
Salvador 2000
>>> ===================== RESTART ======================
>>>
Pepe
Pepe 3000
Jorge
Jorge 2000
Salvador
Salvador 2000
Jose
Jose 2000
Pirulo
Pirulo 3000
>>> ================================ RESTART ================================
>>>
Pepe
Pepe 3000
Jose
Jose 2000
Jorge
Jorge 2000
Pirulo
Pirulo 3000
Salvador
Salvador 2000
>>> ================================ RESTART ================================
>>>
Jose
Jose 2000
Pepe
Pepe 3000
Jorge
Jorge 2000
Salvador
Salvador 2000
Pirulo
Pirulo 3000
>>> ================================ RESTART ================================
>>>
Jorge
Jorge 2000
Pepe
Pepe 3000
Salvador
Salvador 2000
Jose
Jose 2000
Pirulo
Pirulo 3000
>>> ==================== RESTART========================
>>>
Salvador
Salvador 2000
Jose
Jose 2000
Jorge
Jorge 2000
Pepe
Pepe 3000
Pirulo
Pirulo 3000
>>>

LaThortilla (Effort)

Cita de: explorer en 21 Marzo 2015, 18:06 PM
La ordenación de las entradas clave/valor en un diccionario o hash, es "aleatorio" (depende del cómputo del valor hash interno).
Pensé que con el lista.update se solucionaría... pero es igual

explorer

Este comportamiento no es algo propio de Python. En Perl pasa lo mismo con los hash:
$ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x'
b => 2
a => 1
c => 3
$ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x'
c => 3
b => 2
a => 1

Se trata de una medida de seguridad (los diccionarios o hashes se usan con temas de contraseñas, control de sesiones, etc.). Si fuera predecible el orden en que salen los pares clave/valor, se podría suplantar o robar información.

Existen bibliotecas que permiten recuperar la información en el mismo orden en que fue grabada. En Perl, por ejemplo, está Tie::IxHash.


ViejoMajara

¡Hola!

Soy novato en Python y jamás hubiese imaginado que se pudiesen producir salidas aleatorias sin proponerlas explícitamente.

Asunto solventado.

Saludos.

LaThortilla (Effort)

Cita de: explorer en 22 Marzo 2015, 03:25 AM
Este comportamiento no es algo propio de Python. En Perl pasa lo mismo con los hash:
$ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x'
b => 2
a => 1
c => 3
$ perl -E '%x = ( a => 1, b => 2, c => 3); say "$_ => $x{$_}" for keys %x'
c => 3
b => 2
a => 1

Se trata de una medida de seguridad (los diccionarios o hashes se usan con temas de contraseñas, control de sesiones, etc.). Si fuera predecible el orden en que salen los pares clave/valor, se podría suplantar o robar información.

Existen bibliotecas que permiten recuperar la información en el mismo orden en que fue grabada. En Perl, por ejemplo, está Tie::IxHash.



Grade Gracias por la explicación...  ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)